www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

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
Autor: Gast (Gast)
Datum:

Was hat eine wave Datei denn im Header verloren?
Autor: Christian (Gast)
Datum:

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...
Autor: Sven P. (haku) Benutzerseite
Datum:

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.
Autor: Peter (Gast)
Datum:

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.
Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

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
  0x10, 0x20, 0x30, 0x50, 0x80,
  0x80, 0x50, 0x30, 0x20, 0x10

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

Im C-Programm dann
uint8_t Sound1 = {
#include "sound.dat"
};
Autor: Sven P. (haku) Benutzerseite
Datum:

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':
#ifndef MUSIK
#define MUSIK
(...)
uint8_t sound[] = {
...
};
#endif

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

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

Ich denke, du verstehst.
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

> 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.
Autor: Lupin (Gast)
Datum:

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?
Autor: Sven P. (haku) Benutzerseite
Datum:

Hier:
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...
Autor: Random ... (thorstendb)
Datum:
Angehängte Dateien:

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.
Autor: Sven P. (haku) Benutzerseite
Datum:

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

Nachher dazulinken. So oder so ähnlich :-)
Autor: Norgan (Gast)
Datum:

Man benutze xxd -i und fertig.
Autor: Tom S. (torx)
Datum:

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

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

Viel Spass

[1]
http://mjpg-streamer.svn.sourceforge.net/viewvc/mj...
Autor: Sven P. (haku) Benutzerseite
Datum:

Nur zum Spaß:
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 :-)
Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

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
Autor: Andreas K. (derandi)
Datum:

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net