Sound

Aus Ethersex_Wiki
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

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:

  1. Zuerst eine CSV-Datei aus der Midi Datei erstellen mit dem Tool midicsv
  2. Konvertieren der CSV nach .h mit dem Tool m2b
  3. neue .h in Ethersex einbinden
    1. vorhandene entchen.h überscheiben
    2. 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