Forum: PC-Programmierung Zahlen als *.wav-Files temporär zusammensetzen


von H. C. (sunshine)


Lesenswert?

Hi,

ich habe gerade ein Softwareprojekt in einer c-ähnlichen 
Programmiersprache.

Mein Ziel ist es, Zahlen wie 1.3453 oder 3564 als Sound auszugeben.

Ich habe bereits folgende wav-Files mit einzelnen Ziffern erstellt:
1-12, 20, 30, zig, hundert, tausend, und, komma, punkt
und eine entsprechende Logik zum "zusammensetzen" dieser Wav-Files für 
die Ausgabe.

Leider ist es in meiner Programmiersprache nur möglich
EIN wav-File abzuspielen und das Programm läuft dann weiter
ODER
ein wav-File abzuspielen x-Sekunden zu schlafen (Sleep(400)) bis der 
Text gesagt wurde und dann das nächste File mit PlaySound("zwei.wav") zu 
starten.

Da der zweite Weg unmöglich ist und ich Funktionen einer dll 
aufrufen/ausführen kann, muss ich mir die Audioausgabe irgendwie über 
eine dll ermöglichen.

Ich habe sowas noch nie gemacht. Habt Ihr hier einen Tipp für mich, wie 
(welche Programmiersprache) ich hier am besten vorgehe oder ob es sowas 
vielleicht schon fertig gibt?

von Narfie (Gast)


Lesenswert?

Neuer Thread in dem du Variante 2 praktizierst?

von Karl H. (kbuchegg)


Lesenswert?

Wenn du noch nicht so gut drauf bist, bleibt immer noch die Möglichkeit, 
die Länge jedes WAV-Files mit einer Stoppuhr zu ermittlen und die 
Play-Sleep Methode anzuwenden.

> Da der zweite Weg unmöglich ist

Aus welchem Grund?
Wenn mehr in deiner Progtrammiersprache nicht geht, dann geht eben nicht 
mehr.
Alternativ könnte man auch die jeweils benötigten WAV-Files in ein neues 
temporäres File zusammenkopieren (das WAV-Format ist nicht besonders 
schwer zu lesen oder zu schreiben), und dann das Ergebnis abzuspielen.


> .... ich hier am besten vorgehe ....
Ja, das kennen wir schon. 'am besten vorgehen' heisst meistens: kann das 
wer für mich machen - biiiittteee.

: Bearbeitet durch User
von Oliver (Gast)


Lesenswert?

Man könnte ja auch ein temporäres wav-File entsprechend der 
auszugebenden Zahl aus den einzelnen Ziffern zusammenkopieren, und das 
dann ausgeben. Ob deine ominöse Programmiersprache so etwas zulässt, 
keine Ahnung, musst du halt selber rausfinden.

Oliver

von H. C. (sunshine)


Lesenswert?

1. Ich kann wav-Files nur einzeln abspielen, zusammensetzten temporär 
geht in meiner Software nicht.
2. Das mit der Stopuhr wäre eine Möglichkeit und ich könnte auch eine 
Fkt schreiben, dass nach aufruf der "eins.wav" 600ms gewartet und nach 
"drei.wav" 800ms gewartet werden muss.
Allerdings sehe ich dies als ziemlich umständlich an und mein Programm 
kann wärend der ganzen Prozedur nicht weiterarbeiten und auch nicht auf 
Eingaben von außen reagieren :-(
3. Threads gehen hier nicht.
4. Ich möchte nicht betteln und auch nicht, dass es wer von euch macht, 
bzw. wenn wer Ahnung hat und das könnte, würde ich ihm dafür auch was 
zahlen...

Ich richte mich an euch als Leute, die wesentlich mehr Erfahrung haben 
und vielleicht einen (Aus)weg sehen, den ich nicht kenne.

von Jürgen S. (jurs)


Lesenswert?

H. C. schrieb:
> Ich habe bereits folgende wav-Files mit einzelnen Ziffern erstellt:
> 1-12, 20, 30, zig, hundert, tausend, und, komma, punkt
> und eine entsprechende Logik zum "zusammensetzen" dieser Wav-Files für
> die Ausgabe.

Bei Windows CE gibt es z.B. die Funktion "sndPlaySound", der Du neben 
dem abzuspielenden Dateinamen noch einen Parameter mitgeben kannst, 
z.B.:
> SND_ASYNC The sound is played asynchronously and PlaySound returns
> immediately after beginning the sound.
oder
> SND_SYNC Synchronous playback of a sound event. PlaySound
> returns after the sound event completes.

Hast Du schon mal geschaut, ob Dein Software-API außer der von Dir 
genannten Funktion noch eine andere Soundabspielfunktion hat, die 
zusätzlich zum Dateinamen weitere Parameter nimmt?

Ansonsten: Zu jedem Sound die Abspieldauer ermitteln und Deinen 
Abspielalgorithmus so ändern, dass nach dem Aufruf jedes Sounds die 
Mindestpause + Reserve als Delay gemacht wird.

Oder verraten, um welches Betriebssystem und welche Programmiersprache 
es geht. Vielleicht kennt ja jemand Deine "C-ähnliche 
Programmiersprache".

von Oliver (Gast)


Lesenswert?

H. C. schrieb:
> zusammensetzten temporär
> geht in meiner Software nicht.

Glaube ich schlicht nicht. Was ist das denn jetzt genau für eine 
Software?

Oliver

von Frank L. (hermastersvoice)


Lesenswert?

bisher weisst nur DU um welche Programmiersprache es geht und was man 
damit machen kann. Welche Hinweise erwartest du also mit so wenig 
Information für potentielle Helfer?

von Yalu X. (yalu) (Moderator)


Lesenswert?

H. C. schrieb:
> Leider ist es in meiner Programmiersprache nur möglich
> EIN wav-File abzuspielen und das Programm läuft dann weiter

H. C. schrieb:
> ODER
> ein wav-File abzuspielen x-Sekunden zu schlafen (Sleep(400)) bis der
> Text gesagt wurde und dann das nächste File mit PlaySound("zwei.wav") zu
> starten.
>
> Da der zweite Weg unmöglich ist

H. C. schrieb:
> zusammensetzten temporär
> geht in meiner Software nicht.

H. C. schrieb:
> und mein Programm
> kann wärend der ganzen Prozedur nicht weiterarbeiten und auch nicht auf
> Eingaben von außen reagieren :-(

H. C. schrieb:
> 3. Threads gehen hier nicht.

Vielleicht solltest du besser die Dinge aufzählen, die in dieser
C-ähnliche Programmiersprache GEHEN ;-)

... oder von der C-ähnlichen Sprache in eine C-gleiche Sprache wechseln.
Damit geht nämlich (ggf. mit Unterstützung durch das Betriebssystem)
fast alles.

: Bearbeitet durch Moderator
von H. C. (sunshine)


Lesenswert?

Warum bekomme ich schlechte Wertungen von euch?
Ich möchte nicht, dass ihr für mich die Arbeit erledigt und nach 
Anregungen zu fragen- dafür wird ein Forum wohl da sein.
Und das ich Schreibe C-ähnliche Sprache kann mir doch auch nicht 
angekreidet werden, denn was hilft es euch, wenn es um eine leicht 
abgeänderte Programmiersprache nenne, die sowieso keiner kennt und für 
die es auch keine Dokumentation gibt. Mein eigentliches Problem habe ich 
geschildert und hat damit nichts zu tun.

@Jürgen S.
Vielen Dank für den Tipp!!!! Das wäre ja super-interessant.
Ich kann nämlich Funktionen einer dll aufrufen.

So wie ich es sehe, kann ich der Funktion sndPlaySound mit SND_SYNC 
mitgeben, dass er die Files synchron also nacheinander abspielt?!
Kann ich die Soundfiles dann wie folgt abspielen
1
sndPlaySound("eins.wav",SND_SYNC);
2
sndPlaySound("punkt.wav",SND_SYNC);
3
sndPlaySound("vier.wav",SND_SYNC);
und mich nicht mehr um die Abspieldauer der einzelnen Files kümmern?

Die Funktion gibt es in der winmm.dll, diese hab ich nicht auf meinem 
PC.
Wo kann ich sie am besten runterladen?

von Oliver (Gast)


Lesenswert?

H. C. schrieb:
> SND_SYNC

H. C. schrieb:
> und mein Programm
> kann wärend der ganzen Prozedur nicht weiterarbeiten und auch nicht auf
> Eingaben von außen reagieren :-(

Du wirst dich entscheiden müssen...


H. C. schrieb:
> denn was hilft es euch, wenn es um eine leicht
> abgeänderte Programmiersprache nenne, die sowieso keiner kennt und für
> die es auch keine Dokumentation gibt.

Der größte Fehler in einem Forum ist es, wissen zu meinen, was der Rest 
der Welt tatsächlich weiß.
Aber es gibt bestimmt einen Grund, warum du nicht mal verrätst, unter 
welchen Betriebssystem das alles abläuft. Warum auch, ist ja dein 
Problem, nicht unseres.

Oliver

von Jürgen S. (jurs)


Lesenswert?

H. C. schrieb:
> Wo kann ich sie am besten runterladen?

Wie ich oben schrieb, ist "sndPlaySound" die Funktion von "Windows CE".
Das ist Microsofts "abgespecktes Windows" für Kleingeräte mit 
LCD-Bildschirm, beispielsweise für Kfz-Navigationsgeräte.

Für Microsofts Desktop-Betriebssysteme lautet die Funktion zum Abspielen 
von WAV-Dateien über das Windows-API "PlaySound" und die 
Aufrufkonvention ist so ähnlich wie bei Dir und Deiner supergeheimen 
Programmiersprache, jedoch mit drei Parametern. Siehe:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680(v=vs.85).aspx
1
BOOL PlaySound(
2
  LPCTSTR pszSound,
3
  HMODULE hmod,
4
  DWORD fdwSound
5
);

Dadurch können benannte Systemsounds, Sounds aus dem RAM, Sounds aus der 
Registrierdatenbank oder auch Sounds aus einer Datei abgespielt werden. 
Beim Abspielen aus Datei lautet der Aufruf beispielhaft:
1
PlaySound(TEXT("recycle.wav"), NULL, SND_FILENAME);

Der Parameter SND_SYNC muss dabei am Ende nicht angegeben werden, denn 
er ist default. Ansonsten wäre es wohl:
1
PlaySound(TEXT("recycle.wav"), NULL, SND_FILENAME || SND_SYNC);

Die DLL-Datei winmm.dll liegt beispielsweise auf einem WIN7/32-Bit im 
Systempfad C:\Windows\System32

von Blümchenausrupfer (Gast)


Lesenswert?

> Die Funktion gibt es in der winmm.dll, diese hab ich nicht auf meinem
> PC.

Dann ist dein Windows älter als ca. 16 Jahre oder die Installation ist 
defekt ...

BTW: Falls es doch etwas komplexer wird, könntest du vielleicht eine 
richtige Programmiersprache verwenden, eine DLL erzeugen und dann die 
komische Sprache die grobe Steuerung übernehmen lassen.

von Mark B. (markbrandis)


Lesenswert?

H. C. schrieb:
> Und das ich Schreibe C-ähnliche Sprache kann mir doch auch nicht
> angekreidet werden, denn was hilft es euch, wenn es um eine leicht
> abgeänderte Programmiersprache nenne, die sowieso keiner kennt und für
> die es auch keine Dokumentation gibt.

Als nächstes erzählst Du uns wohl, dass das Ganze auf einem 
Betriebssystem läuft welches keiner kennt und auf einer Hardware, für 
die es keine Doku gibt.

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

H. C. schrieb:
> oder ob es sowas vielleicht schon fertig gibt?
Wurde TTS schon erwähnt?

H. C. schrieb:
> eine leicht abgeänderte Programmiersprache nenne, die sowieso keiner kennt
AutoIt?

von uwe (Gast)


Lesenswert?

man kann die Datei ja auch mit einer eigenen Routine öffnen und aus der 
Samplerate, anzahl der Kanäle, Dateigröße, bits per Sample die länge 
berechnen.
http://de.wikipedia.org/wiki/RIFF_WAVE

von Karl H. (kbuchegg)


Lesenswert?

uwe schrieb:
> man kann die Datei ja auch mit einer eigenen Routine öffnen

Ich schalte mal in den H.C. Emulationsmodus:

Aber nicht mit meiner C-ähnlichen Programmiersprache, die ausser PLAY 
und SLEEP nicht sehr viel mehr kann.

von Mark B. (markbrandis)


Lesenswert?

Karl Heinz schrieb:
> Ich schalte mal in den H.C. Emulationsmodus:
>
> Aber nicht mit meiner C-ähnlichen Programmiersprache, die ausser PLAY
> und SLEEP nicht sehr viel mehr kann.

:-)

Womöglich kann man aber aus einer C-ähnlichen Programmiersprache heraus 
andere Programme aufrufen, die alles können?

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.