Sound

Aus Ethersex_Wiki
Version vom 6. April 2010, 16:04 Uhr von Habo (Diskussion | Beiträge) (Midi nach .h Konvertieren)
Wechseln zu: Navigation, Suche

PWM Sound

Via PWM kann auch Sound ausgegeben werden.

make menuconfig

I/O support  --->  
 [*] PWM Generator  ---> (NEW)     

   PWM Generator
     [*] PWM Wave
     [*] PWM Melody

See also HaboWAV

Wave

Getestet mit atmega644

Es wird eine kleine 8 Bit Mono 8000Hz PCM WAV Datei abgespielt. Die entsprechende Datei kann einfach ausgetauscht werden und nach dem neukompilieren kann man diese dann abspielen.

hardware/pwm/ethersex.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 8 bit, mono 8000 H

Melody

Getestet mit atmega644 und atmega128

Es wird eine Melody abgespielt die als Notenwerte abgelegt sind. Als Beispiel liegt das Lied "Alle meine Entchen" unter hardware/pwm/entchen.h bereit.

Für weitere eigene Songs kann man ein include in hardware/pwm/pwm_melody.c einfügen und dann das struct songs mit weiteren Melodien aus dem Programmspeicher füllen.

Das struct songs ist selbst folgendermaßen aufgebaut.

{ name,     delay, transpose, struct of notes, # of notes }
name: Anzeigename für ECMD. Bsp: Alle meine Entchen
delay:  Faktor für die Geschwindigkeit der Noten, btw. der Pausen. Bsp: 20
transpose: Wenn ja, um wieviele Töne soll das Lied Transponiert werden. Bsp: 4
struct of notes: name des structs aus dem include das die Noten enthält: Bsp: entchen_notes
# of notes: Errechnet aus dem struct die Anzahl der Noten: Bsp: songlength(entchen_notes)


Beispiele

Beispiel: hardware/pwm/pwm_melody.c anpassen

#include "newsong.h"
[...]
struct song_t songs[] PROGMEM = {
 { "entchen", 10, 4, entchen_notes, songlength(entchen_notes) },
 { "newsong", 40, 1, newsong_notes, songlength(newsong_notes) }

};

Beispiel: newsong.h hinzufügen

#ifndef PWM_NEWSONG_H
#define PWM_NEWSONG_H
/*
 * The adapted melody is in the public domain.
 */
const struct notes_duration_t newsong_notes[] PROGMEM =
{
   {C,8}, {D,8}, {E,8}, {E,8},
   {G,16},{G,16},
   {A,8}, {A,8}, {A,8}, {A,8},
   {G,24},{p,8}, {p,  1}, {p,  1},
   {A,8}, {A,8}, {A,8}, {A,8},
   {G,24},{p,8}, {p,  1}, {p,  1},
   {F,8}, {F,8}, {F,8}, {F,8},
   {E,16},{E,16},
   {D,8}, {D,8}, {D,8}, {D,8},
   {C,24},{p,8}, {p,  1}, {p,  1}
};
#endif /* PWM_NEWSONG_H */

Midi nach .h Konvertieren

Um MIDI Dateien in brauchbare Noten Daten umzuwandeln kann man folgende Schritte durchführen:

  1. Zuerst eine CSV-Datei aus der Midi Datei erstellen mit dem Tool [1]
  2. Konvertieren der CSV nach .h mit dem Tool [2]
  3. neue .h in Ethersex einbinden
    1. vorhandene entchen.h überscheiben
    2. oder songs[] um den neuen song erweitern

Konkret sieht das so aus, wenn man die existierende Datei überschreiben will

patha/midcsv INPUTMIDIFILE EXAMPLE.CSV
pathb/m2b EXAMLE.CSV > hardware/pwm/entchen.h

Ich habe eine entsprechend angepasste m2b, wegen Copyrightbedenken ist das aber noch nicht im git oder Wiki veröffentlicht. Bei Fragen oder Hilfe -> contact habo