Forum: Mikrocontroller und Digitale Elektronik Arduino Musik


von Tobias M. (tobi100)


Lesenswert?

Hallo,
ich würde gerne mit einem Arduino, eine Musikdatei abspielen. So etwas 
gibt es ja auch schon: 
http://www.instructables.com/id/Arduino-Chiptunes/?ALLSTEPS ,allerdings 
ist das nicht die Musik, die ich abspielen möchte, welch Wunder. Nun 
möchte ich wie in diesem Video: 
https://www.youtube.com/watch?v=tUapZ_JdHLE meine eigene Musik 
abspielen. Allerdings weiß ich nicht, wie ich die Raw-Datei in eine 
Header-Datei umwandeln soll. Denn Google hat nicht mehr den Binary file 
to C-style char array converter zum Downloaden: 
https://code.google.com/archive/p/bin2h/ . Meine Frage ist jetzt wie 
kann ich die Musikdatei in eine Header-Datei umwandeln ?

von Nop (Gast)


Lesenswert?

Tobias M. schrieb:

> https://code.google.com/archive/p/bin2h/ . Meine Frage ist jetzt wie
> kann ich die Musikdatei in eine Header-Datei umwandeln ?

Beispielsweise mit dem Unix-Tool xxd. Ist auch bei Cygwin bei.

von Juppi.J. (Gast)


Lesenswert?

Machst du das nur Interessen halber,ok!
Wenn es aber um die Geräusche/Musik geht dann lieber noch ein seriell 
MP3 Player.;-))

von Tobias M. (tobi100)


Lesenswert?

Ich möchte einen kleinen Glücksspielautomaten bauen, dieser soll eine 
Hintergrund Musik haben ;) Ich denke, ich brauch dafür keinen seriell 
MP3 Player

von Tobias M. (tobi100)


Lesenswert?

Ich habe mir jetzt Cygwin heruntergeladen. Was muss ich jetzt im Cygwin 
Terminal eingeben, so dass auch der raw-Datei eine header-Datei wird ?

von PittyJ (Gast)


Lesenswert?

Die Musik im ersten Beitrag auf den Arduino ist doch ein einfaches 
Rechtecksignal. Alle paar ms wird die Frequenz geändert. Oder sehe ich 
das Falsch? So wie man das in den 80ern gemacht hat.
Da kann man doch keine Raw-Datei für nehmen. Die ist doch viel zu gross, 
jedenfalls für normale Arduinos.

Was verstehst du genau unter einer Raw-Datei? Ich kenne das als 16-Bit 
CD Abzüge, mit 176 KBytes pro Sekunde.
Was für einen Arduino hast du genau?

von Tobias M. (tobi100)


Lesenswert?

PittyJ schrieb:
> Die Musik im ersten Beitrag auf den Arduino ist doch ein einfaches
> Rechtecksignal. Alle paar ms wird die Frequenz geändert. Oder sehe ich
> das Falsch? So wie man das in den 80ern gemacht hat.
> Da kann man doch keine Raw-Datei für nehmen. Die ist doch viel zu gross,
> jedenfalls für normale Arduinos.

In welchem Format soll ich denn ein Lied abspeichern ?
Ein normales Lied hat im RAW Format hat eine Größe von 4000kb
Ein Arduino Nano hat einen 32000kb Speicherplatz.

>
> Was verstehst du genau unter einer Raw-Datei? Ich kenne das als 16-Bit
Ich habe die Datei als 8-Bit abgespeichert.
> CD Abzüge, mit 176 KBytes pro Sekunde.
> Was für einen Arduino hast du genau?
Arduino Nano

von Dietrich L. (dietrichl)


Lesenswert?

Tobias M. schrieb:
> Ein Arduino Nano hat einen 32000kb Speicherplatz.

Nein, er hat nur 32kB = 32768 Byte (nicht kB!)

von Tobias M. (tobi100)


Lesenswert?

Oh, ok.
Das Hilft mir jetzt aber Trotzdem nicht weiter, denn ich weiß immer noch 
nicht, wie ich eine beliebige Musikdatei in eine Header-Datei umwandle ?

von Dietrich L. (dietrichl)


Lesenswert?

Tobias M. schrieb:
> Das Hilft mir jetzt aber Trotzdem nicht weiter,

Das hilft insofern, dass Du damit mal rechnen kannst, wie viele Sekunden 
Musik der Datei du in den 32kB speichern kannst - und damit diese Lösung 
(wahrscheinlich) uninteressant ist.

von Nop (Gast)


Lesenswert?

Tobias M. schrieb:
> Ich habe mir jetzt Cygwin heruntergeladen. Was muss ich jetzt im Cygwin
> Terminal eingeben, so dass auch der raw-Datei eine header-Datei wird ?

Du mußt erstmal im Cygwin-Installer (diesen graphischen Paketmanager) 
nach "xxd" suchen und das ggf. installieren Wenn das geklappt hat, gib 
beim Prompt im Terminal mal "xxd -h" ein, da sollte schonmal was kommen.

Und dann machst Du:
xxd -i inputfile outputfile

Wobei Outputfile fann das C-Headerfile ist. -i wählt bei der 
Konvertierung gerade das C-Headerformat an. Das kannst Du dann einfach 
in einem geeigneten C-File als include aufnehmen.

Wenn Dein Compiler das nicht von selber erkennt, würde ich das "unsigned 
char" am Amfang des Headerfiles noch durch "const unsigned char" 
ersetzen, damit das Array auch wirklich im ROM landet und nicht etwa im 
RAM.

von Nop (Gast)


Lesenswert?

Bei 8bit Auflösung in Mono und 8kHz Samplingfrequenz kann man Frequenzen 
bis knapp 4kHz wiedergeben. Vor dem Runtersamplen natürlich durch einen 
Tiefpaß jagen (3.5 kHz). Das reicht dann bei 32kB für 4 Sekunden.

Man kann natürlich nach Art der alten Tracker auf dem Heimcomputer auch 
verschiedene Töne von vielleicht 100ms Länge aufnehmen und die kreativ 
hintereinandersetzen. Zwei Oktaven zu je 8 Tönen wären dann 1.6s 
Gesamtlänge, das würde passen.

von Tobias M. (tobi100)


Lesenswert?

Nop schrieb:
> Tobias M. schrieb:
>> Ich habe mir jetzt Cygwin heruntergeladen. Was muss ich jetzt im Cygwin
>> Terminal eingeben, so dass auch der raw-Datei eine header-Datei wird ?
>
> Du mußt erstmal im Cygwin-Installer (diesen graphischen Paketmanager)
> nach "xxd" suchen und das ggf. installieren Wenn das geklappt hat, gib
> beim Prompt im Terminal mal "xxd -h" ein, da sollte schonmal was kommen.

Das hat soweit auch geklappt, wenn ich xxd -h ins Terminal eingebe, 
kommt auch jede menge.

>
> Und dann machst Du:
> xxd -i inputfile outputfile

Ich habe den inputfile eigesetzt, allerdings hat er ihn nicht gefunden.
Was kann ich tun, damit das Programm den File findet ?
>
> Wobei Outputfile fann das C-Headerfile ist. -i wählt bei der
> Konvertierung gerade das C-Headerformat an. Das kannst Du dann einfach
> in einem geeigneten C-File als include aufnehmen.
>
> Wenn Dein Compiler das nicht von selber erkennt, würde ich das "unsigned
> char" am Amfang des Headerfiles noch durch "const unsigned char"
> ersetzen, damit das Array auch wirklich im ROM landet und nicht etwa im
> RAM.

von Ralf M. M. (ramime)


Lesenswert?

Für den Fall, dass Du mit der von Dir eingeschlagenen Richtung doch 
nicht weiterkommen solltest, würde ich Dir zu einem von diesen Dingern 
raten.
Die Lieferzeit ist zwar etwas länger, aber für ein Bastelprojekt finde 
ich die echt brauchbar und leicht anzusteuern:

http://www.ebay.de/itm/YX5300-UART-Control-Serial-MP3-Music-Player-Module-For-Arduino-AVR-ARM-PIC-MF-/172285756859

http://www.ebay.de/itm/MP3-Musik-Player-UART-Seriell-Schnittstelle-Modul-Mit-1W-Sprecher-Fur-Arduino-GE-/172296440559

von Tobias M. (tobi100)


Lesenswert?

Danke, werde ich im Merken, wenn es doch nichts wird.

von Juppi.J. (Gast)


Lesenswert?

Biste doch beim Seriell MP3 Player gelandet;-))

von W.S. (Gast)


Lesenswert?

Tobias M. schrieb:
> Allerdings weiß ich nicht, wie ich die Raw-Datei in eine
> Header-Datei umwandeln soll.

Tobias M. schrieb:
> Was muss ich jetzt im Cygwin
> Terminal eingeben, so dass auch der raw-Datei eine header-Datei wird ?

Ja, sag mal, willst du nun ein Programmierer sein oder nicht?

Zu allererst eines: aus so etwas macht man keine Headerdatei, sondern 
eine C-Quelle (also deinemusik.c oder so). Und wenn dir das nicht 
gefällt, dann mach eine .inc draus, aber halte Headerfiles (*.h) sauber 
und frei von sowas.

Ansonsten schau nach, wie eine .wav aufgebaut ist und schreib dir dafür 
ein passendes Tool. Du solltest sowas können, bevor du mit dem 
Programmieren von Mikrocontrollern beginnst.

Ist ja auch ganz einfach:
- Sounddatei öffnen und in Puffer schreiben (du willst ja bloß kurze 
Stücke haben, gelle)
- eine Zieldatei kreieren und dort erstmal das reinschreiben:
1
const char name_des_sounds[] =
2
{
Dann schreibst du alle deine Samples als Dezimalzahlen mit Komma 
dahinter und an passender Stelle (z.B. alle 8 Samples) ein CRLF. 
Anschließend schreibst du:
1
};
und nochmal ein CRLF in die Datei und schließt diese. Damit hast du 
deinen Sound - allerdings unkomprimiert wie er eben in einer .wav 
drinsteht.

W.S.

von Jobst Q. (joquis)


Lesenswert?

Eine Alternative zum Musik spielen mit knapp bemessenem Speicher wären 
MIDI-Dateien. Die enthalten im wesentlichen nur Daten von Tonhöhe, 
Lautstärke und Länge.

von Nop (Gast)


Lesenswert?

Tobias M. schrieb:
> Ich habe den inputfile eigesetzt, allerdings hat er ihn nicht gefunden.
> Was kann ich tun, damit das Programm den File findet ?

Naja Du mußt das xxd-Kommando schon entweder mit absolutem Pfad zum 
Inputfile angeben, oder Du wechselst vorher im Terminal in den Ordner, 
wo das Inputfile halt ist.

von Nop (Gast)


Lesenswert?

W.S. schrieb:
> Zu allererst eines: aus so etwas macht man keine Headerdatei

Oops. Ich bin es dermaßen gewohnt, Headerdateien zu includieren, daß ich 
bei include-file reflexhaft an Headerdateien gedacht hatte.. pfeif 
Daher kam das.

von Tobias M. (tobi100)


Lesenswert?

Danke, ich habe geschafft eine MP3 Datei in eine Header-Datei 
umzuwandeln. Es sind über 400 000 Zeilen bei raus gekommen .........

von Nop (Gast)


Lesenswert?

Ich nehme mal an, die MP3-Datei war aber auch deutlich größer als die 
32kB (KILObyte), die Dein Zielcontroller hat.

von Jim M. (turboj)


Lesenswert?

Tobias M. schrieb:
> Danke, ich habe geschafft eine MP3 Datei in eine Header-Datei
> umzuwandeln. Es sind über 400 000 Zeilen bei raus gekommen .........

Du hättest die MP3 erst in ein RAW/WAV Format wandeln sollen,
aber dann wären es noch vieeel mehr Zeilen geworden...

Das Platzproblem könnte man mit einer SD Karte lösen.

von Tobias M. (tobi100)


Lesenswert?

Jim M. schrieb:
> Tobias M. schrieb:
>> Danke, ich habe geschafft eine MP3 Datei in eine Header-Datei
>> umzuwandeln. Es sind über 400 000 Zeilen bei raus gekommen .........

Ich habe es vorher in eine RAW Datei umgewandelt.
>
> Du hättest die MP3 erst in ein RAW/WAV Format wandeln sollen,
> aber dann wären es noch vieeel mehr Zeilen geworden...
>
> Das Platzproblem könnte man mit einer SD Karte lösen.

...ja mehr oder weniger

von Markus (Gast)


Lesenswert?

Für einen guten Sound auf einem Arduino Uno sorgt für gewöhnlich die 
MOZZI-Library:

http://sensorium.github.io/Mozzi/

von hust (Gast)


Lesenswert?

Tobias M. schrieb:
> Danke, ich habe geschafft eine MP3 Datei in eine Header-Datei
> umzuwandeln. Es sind über 400 000 Zeilen bei raus gekommen .........

und das falsche format!!

denn jetzt musst du MP3 decodieren ^^

von hust (Gast)


Lesenswert?

achso.. die syntie dinger sind dafür am besten geeignet.
retro style eben :P

mach dich mal schlau was RTTTL  ist ...

da gibts auch diverse samples

von Tobias M. (tobi100)


Lesenswert?

Markus schrieb:
> Für einen guten Sound auf einem Arduino Uno sorgt für gewöhnlich die
> MOZZI-Library:
>
> http://sensorium.github.io/Mozzi/

Das werde ich mir mal genauer angucken. Auf dem ersten Blick, sah das 
schon mal gut aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.