Sound
Inhaltsverzeichnis
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
Ist "use VFS", btw. VFS_PWM_WAV_SUPPORT aktiviert. Können die Wave Dateien auch aus dem VFS gelesen werden. z.B. von der SD-Karte, indem man den Namen der Wave-Datei mit angibt. Auf diese Weise können deutlich mehr und auch größere Wave-Dateien benutzt werden.
pwm wav e6.wav
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:
- Zuerst eine CSV-Datei aus der Midi Datei erstellen mit dem Tool midicsv
- Konvertieren der CSV nach .h mit dem Tool m2b
- neue .h in Ethersex einbinden
- vorhandene entchen.h überscheiben
- oder das struct songs[] in pwm_melody.c um den neuen Song erweitern (include nicht vergessen!)
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