Forum: Mikrocontroller und Digitale Elektronik wav Datei in h-File konvertieren


von Christian (Gast)


Lesenswert?

Hallo,

kennt jemand einen Konverter, mit dem man Wave Dateien (.wav) in 
Header-Files (.h) konvertieren/exportieren kann, um diese dann direkt in 
C-Sourcecode einzubinden?
Wie das .wav Format aufgebaut ist, weiss ich, ich könnte es selber 
programmieren, aber wenn es sowas schon gibt, warum das Rad neu 
erfinden?
Danke für alle Tipps.

Gruß,
Christian

von Gast (Gast)


Lesenswert?

Was hat eine wave Datei denn im Header verloren?

von Christian (Gast)


Lesenswert?

Wenn man Audio Daten direkt als Array im Code und damit im Flash haben 
will und keinen separaten Flashspeicher für Audio Daten spendieren 
will...

von Sven P. (Gast)


Lesenswert?

Christian wrote:
> Wenn man Audio Daten direkt als Array im Code und damit im Flash haben
> will und keinen separaten Flashspeicher für Audio Daten spendieren
> will...
...dann packt man die aber immer noch nicht in einen Header, sondern in 
eine Quelltextdatei. Sonst wird nämlich bei jedem 'Inkludieren' des 
Headers das ganze Array nochmal in den Speicher kopiert.

Sowas kann man wunderbar mit Perl lösen, ist ein Einzeiler auf der 
Konsole.

von Peter (Gast)


Lesenswert?

oder noch besser in dem man sie als Resourcen-Datei oder als Object 
einfach dazulinken.
Es gab mal ein Thread wo jemand gezeigt hat, das man aus jeder Datei 
einfach ein obj machen kann und der linker es zu dem Projekt linkt.

von Karl H. (kbuchegg)


Lesenswert?

Sven P. wrote:
> Christian wrote:
>> Wenn man Audio Daten direkt als Array im Code und damit im Flash haben
>> will und keinen separaten Flashspeicher für Audio Daten spendieren
>> will...
> ...dann packt man die aber immer noch nicht in einen Header, sondern in
> eine Quelltextdatei. Sonst wird nämlich bei jedem 'Inkludieren' des
> Headers das ganze Array nochmal in den Speicher kopiert.

Ich denke du spaltest hier Haare.
Ob man das noch Header-Datei nennen will, oder irgendwie anders, ist 
eine Frage der persönlichen Vorliebe. Passend wäre der Name 
'Include-File'

Das Tool sollte im Idealfall die Sound-Info in eine Datei extrahieren, 
die zb so aussieht

sound.dat
1
  0x10, 0x20, 0x30, 0x50, 0x80,
2
  0x80, 0x50, 0x30, 0x20, 0x10

oder so ähnlich. Hauptsache die Soundwerte sind als Zahlenwerte darin 
enthalten.

Im C-Programm dann
1
uint8_t Sound1 = {
2
#include "sound.dat"
3
};

von Sven P. (Gast)


Lesenswert?

Karl heinz Buchegger wrote:
> Sven P. wrote:
>> Christian wrote:
>>> Wenn man Audio Daten direkt als Array im Code und damit im Flash haben
>>> will und keinen separaten Flashspeicher für Audio Daten spendieren
>>> will...
>> ...dann packt man die aber immer noch nicht in einen Header, sondern in
>> eine Quelltextdatei. Sonst wird nämlich bei jedem 'Inkludieren' des
>> Headers das ganze Array nochmal in den Speicher kopiert.
>
> Ich denke du spaltest hier Haare.
> Ob man das noch Header-Datei nennen will, oder irgendwie anders, ist
> eine Frage der persönlichen Vorliebe. Passend wäre der Name
> 'Include-File'
NEIN ich spalte keine Haare! Beispiel:
Datei 'musik.h':
1
#ifndef MUSIK
2
#define MUSIK
3
(...)
4
uint8_t sound[] = {
5
...
6
};
7
#endif

Wenn du die jetzt in zwei Quelltextdateien einbindest und diese 
kompilierst, wird dein Linker meckern, weil er zwei gleichnamige Objekte 
vorfindet!

>
1
> uint8_t Sound1 = {
2
> #include "sound.dat"
3
> };
4
>
DAS wiederum ist ok, solange es in einem C-File stattfindet.

Ich denke, du verstehst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Wenn du die jetzt in zwei Quelltextdateien einbindest und diese
> kompilierst, wird dein Linker meckern, weil er zwei gleichnamige Objekte
> vorfindet!

Der meiner Ansicht nach einen schlampigen Programmierstil fördernde gcc 
kann solche "Doubletten" erkennen und beseitigen, ohne zu nörgeln.

von Lupin (Gast)


Lesenswert?

Ich glaube die besten Methoden um binärdateien ein zu binden sind:

a) Per objcopy (aus der Binärdatei eine .o Datei erstellen, die dann zum 
Projekt dazu gelinkt wird). Man kann, wenn man mehrere Binärdateien als 
.o verpackt hat daraus auch eine Library machen.

b) Per .incbin im gcc assembler (hab ich bisher nur für ARM ausprobiert, 
wird für AVR wohl auch gehen)

Oder kennt jemand bessere Möglichkeiten?

von Sven P. (Gast)


Lesenswert?

Hier:
1
cat <DATEI> | od -t x1 -x | sed -n "1~2p" | cut -d " " -f 2- | sed "s/ /, 0x/g" | sed "s/.*/0x&,/" | head -n -1

Sieht doch hübsch aus...

von Random .. (thorstendb) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hab seinerzeit so was mal mit nem LPC2148 und CoolEdit gemacht.
Ein Stück ausm Song herausgeschnitten und ans .txt abgespeichert.

Viel Spass mit dem Beispiel, ist ne Sine Table und ein Ausschnitt aus 
nem Song drin :-)
Speed-Einstellung am lustigsten mit nem Poti per ADC grins


VG,
/th.

von Sven P. (Gast)


Lesenswert?

Und die Sache mit dem Assembler:
1
$ echo "mein_name: .incbin <datei>" | as -o mein_name.o

Nachher dazulinken. So oder so ähnlich :-)

von Norgan (Gast)


Lesenswert?

Man benutze xxd -i und fertig.

von Tom S. (torx)


Lesenswert?

Hi,
Fuer Linux (und andere Systeme mit gaengigen Shell Befehlen) gehts wie 
unter [1] gezeigt.

Der relevante Part im Makefile ist:
1
# converts multiple JPG files to a single C header file
2
testpictures.h: ...liste der abhaengigkeiten...
3
  @echo "/* automatically generated content, do not edit manually!" > testpictures.h.tmp
4
  @echo " */ " >> testpictures.h.tmp
5
  @FILES=...Liste der Dateinamen... && \
6
    for file in $$FILES; do \
7
      echo "converting file: $$file.jpg"; \
8
      echo "static const unsigned char PIC_$$file[] = { " >> testpictures.h.tmp; \
9
      od -An -v -t x1 pictures/$$file.jpg | sed -e "s/\ \([0-9a-fA-F]*\)/\ 0x\1,/g" >> testpictures.h.tmp; \
10
      echo "};" >> testpictures.h.tmp; \
11
    done;
12
  @cat testpictures.h.tmp | tr '\n' 'N' | sed -e "s/,N};/};/g" | tr 'N' '\n' > testpictures.h
13
  @rm testpictures.h.tmp

Viel Spass

[1] 
http://mjpg-streamer.svn.sourceforge.net/viewvc/mjpg-streamer/mjpg-streamer/plugins/input_testpicture/Makefile?view=markup

von Sven P. (Gast)


Lesenswert?

Nur zum Spaß:
1
f=DATEI; echo char $(basename "$f") = \{; cat "$f" | od -t x1 -x | sed -n "1~2p" | cut -d " " -f 2- | sed "s/ /, 0x/g" | sed "s/.*/0x&,/" | sed "s/^/\\t/" | head -n -1; echo -e \}\;\\n$(basename "$f")_len = $(stat -c %s "$f")\;

Mach das mal mit Dos :-)

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Und für die mausschubsenden DOSen-Benutzer:

http://mh-nexus.de/de/ (HxD)

Kann eine geöffnete Datei als C-Array abspeichern.

Wenn es sich aber um einen GCC Compiler handelt würde ich eher zu der 
Methode greifen die ich in Beitrag "Tabellen aus Konstanten in Programm linken?" 
hier schonmal beschrieben habe. Ist praktischer wenn sie die 
einzubauenden Daten öfter mal ändern.

Matthias

von Andreas K. (derandi)


Lesenswert?

Mit dem bisschen Speicher eines µC wird er aber auch weit kommen.
Und wenn ich mich recht entsinne ist ein Array auch keine gute 
Aufbewahrungsmethode.

von Info (Gast)


Lesenswert?

Audacity kann Rohdaten (also z.B. WAV / PCM ohne Header) in 
verschiedenen "Formaten" exportieren:
http://manual.audacityteam.org/man/other_uncompressed_files_export_options.html

Wie funktioniert das mit dem dazulinken genau? Wie werden die Daten 
addressiert?

von Daniel A. (daniel-a)


Lesenswert?

Info schrieb:
> Wie funktioniert das mit dem dazulinken genau? Wie werden die Daten
> addressiert?

Immer gleich, du musst nur die Symbole kennen. Kann man 99.9% der Fälle 
mit objdump (.o) oder readelf (.elf) auslesen. Im c code dann eifach als 
z.B. "extern char symbolname_start[];" deklarieren. Solange die Symbole 
übereinstimmen ist gut.

von Info (Gast)


Lesenswert?


von Info (Gast)


Lesenswert?

Mein Favorit ist 
https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/

Man kann das Object sowohl mit ld als auch mit objcopy erstellen.
Bei EmBitz (EmBlocks) reicht es, das Object file mit in das Projekt 
aufzunehmen, damit es gelinkt wird.

Schön wäre, den Daten einen festen Bereich mitzugeben, so dass sie nicht 
immer neu geflasht werden.

Audacity
  Normalize
  Resample
  Export

Bei mir ist irgendwas schiefgelaufen und bei Import zum Prüfen hatte ich 
dann Stereo-Daten mit vielfacher Sampling rate (Mickey mouse - auf 
Sampling Rate [Projekt und Spur] achten!). Die Dateigrößen mehrerer 
Sounds ähnlicher Länge sollten auch zusammenpassen.

Werde als nächstes ausprobieren, ob sich mit A-law oder vergleichbarem 
Mapping 8->10 Bit noch die Qualität verbessern lässt.

von S. R. (svenska)


Lesenswert?

Andreas K. schrieb:
> Mit dem bisschen Speicher eines µC wird er aber auch weit kommen.
> Und wenn ich mich recht entsinne ist ein Array auch keine gute
> Aufbewahrungsmethode.

Unfug, beides.

Der uC-interne Flash ist für kleinere Blobs (z.B. Zeichentabellen, 
Icons, Warntöne) sehr wohl gut geeignet; 32+ KB Flash machst eher nicht 
mit Code allein voll und Geld zurück gibt's auch keins.

In C taucht so ein Blob immer als Array auf. Ob das nun vom Linker durch 
zwei Symbole "Daten_start" und "Daten_end" oder vom Compiler mit einem 
Symbol "Daten[]" definiert wird, spielt auch keine Rolle mehr.

von W.S. (Gast)


Lesenswert?

S. R. schrieb:
> Unfug, beides.

Sehe ich ähnlich.

Aber es ist schon erstaunlich: rund drei Jahre nach der Lernbetty sind 
die tollen Programmierer hier in diesem Forum noch immer nicht in der 
Lage, so etwas vernünftig zu implementieren. Von der bei der Lernbetty 
benutzten Audio-Kompression (nach Sierra) ganz abgesehen.

W.S.

von Jonny O. (-geo-)


Lesenswert?

Hallo,

ich habe zu diesem Zweck mal ein kleines Windows-Programm geschrieben:

Beitrag "Wave File zu C-Array Konverter (Windows Programm)"

Ev. hilft es dem einen oder anderen.

Grüße,
J.O

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.