Seite 1 von 1

MCI -> Mikrophon mit Aussteueranzeige?

Verfasst: 31.01.2011 01:02
von DarkSoul
Hallo,

ich habe mir ein Audiorecorder-Include gebastelt, welches Töne aufnehmen und wiedergeben kann. Das läuft über das MCI. Das funktioniert auch schon. Das soll auch gleichzeitig noch eine Soundausgabe für nicht-DX-Programme werden.

Nun der Haken, der mir erst auffiel, als ich mir mit dem Include einen einfachen Soundrecorder machen wollte: Wenn man z.B. mit dem Mikro aufnimmt (meinetwegen auch eien andere Quelle oder Line-IN), hätte man gerne auch eine Balkenuhr mit Lautstärke drauf, damit man gut genug aussteuert.

Kann man irgendwie das aufgenommene während der MCI-Aufnahme mit "record" abgreifen und dafür auswerten?

Hatte mir sowas überlegt:
-Neben der eigentlichen Aufnahme zusätzlich immer kleine Happen von soundso vielen Millisekunden aufzeichnen.
-Diese Happen irgendwie aus dem Speicher fischen
-Den Ton gleichrichten (bzw. Vorzeichen killen) und einmal rms (=Arithmetisches Mittel?) und einmal peak (den größten Wert) ermitteln.
-Die Werte normieren und als Rückgabeparameter abliefern, damit man sein virtuelles Messinstrument daraus kreativ basteln kann.
Das ganze in eine Procedure stopfen. Nennen wir das Kind z.B. GetRecorderLevel()
Als bestimmzeitspanne hatte ich so an den Abschnitt zwischen dem dieshierigen und letzteren Aufruf von GetRecorderLevel() gedacht, damit kein Peak übersehen wird, weil die procedure zu wenig aufgerufen wurde.

Wie mache ich das konkret?

Wenn das bei MCI nicht geht, kann ich die Sampledaten aus dem Windows-Mixer irgendwie anzapfen?

Das Include hat folgende Struktur:

Code: Alles auswählen

InitRecorder()                 ;enthält die Tests, ob mci-Record zur Verfügung steht. Bisher ebenfalls auf Grund von Faulheit nicht vorhanden
a=CreateRecorder(#pb_any,44100,16,2) ;Recorder erstellen. Das mit dem #pb_any und sonst die Struktur ist analog zu z.B. CreateSprite(). Die Parameter sind die bekannten Eckdaten einer .wav.
StartRecorder(a) ;Aufnahme starten
  
;Hier müsste zur Perfektion die Dezibel-Uhr (wie heißt so ein Ding eigentlich??) angesteuert werden. Also irgendwas mit Startdrawing() auf irgendeinem Fenster-wie-auch-immer und der oben erklärten bisher fehlenden Funktion.

StopRecorder(a) ;Aufnahme stoppen
SetRecorderPos(a,0) ;Zurückspulen
PlayRecorder(a) ;Nochmal hören
SaveRecorder(a,"test.wav") ;Und abspeichern
FreeRecorder(a); und nun in Müll damit

;recorder is putt! :-(

Die Prüfung, ob die einzelnen Procedures Erfolg hatten, habe ich bewusst ausgelassen. In der Praxis wären da ein paar if, die z.B. volle Datenträger, nicht vorhandene Aufnahmemöglichkeit, fehlende Soundkarten usw. abfangen würden. Ich habe nur das allernötigste hingeschrieben, um das Vorgehen und den Verwendungszweck der Anzeige zu erläutern.

lg

Re: MCI -> Mikrophon mit Aussteueranzeige?

Verfasst: 01.02.2011 11:55
von Susan20
Hi,
ich würde weggehen von den mci-Funktionen. Ein absoluter hilfreicher Code für Sound-Aufnahme und -Darstellung (Oszilloskop-artig) über Win-Api-Funktionen ist im englischen Forum von drgolf zu finden:

http://www.purebasic.fr/english/viewtop ... e&start=45

Die anfallenden RAW-PCM-Daten werden in ein Buffer geschrieben. Diese Daten werden ausgelesen und dargestellt (das dürfte dich ja besonders interessieren). Am Schluss erfolgt die Umwandlung in eine Wave-Datei. Man kann diese Buffer-Daten aber auch nach lame "streamen".
Zugegeben: Der Code ist etwas unübersichtlich und die GUI-Erstellung für einen Nicht-Profi gewöhnungsbedürftig. Aber wenn man sich darein arbeitet und sich das herausholt, was man braucht, ist es eine super Sache. Für mich einer der tollsten Codes, die in den PB-Foren gepostet wurden. - Susan

Re: MCI -> Mikrophon mit Aussteueranzeige?

Verfasst: 01.02.2011 19:51
von DarkSoul
Das ist genau das richtige :mrgreen: . Danke!!

Das Beispiel übersteuert allerdings total, so dass die grüne Linie über den Bandbereich hinausschlägt und den Fensterrahmen vollschmiert. xD

Das kann ich sicher so umdengeln, dass auch eine Schneidefunktion da ist. Das soll nämlich u.a. auch für ein Spiel sein, bei dem der audiotechnisch unversierte Benutzer möglichst leicht eigene Flatulenztöne über sein Mic aufnehmen und schneiden kann, die dann als Erweiterung in den Spielverlauf eingebunden werden. Ist sicher auch eine Automatik mit dem Rohdaten möglich.

Das Benutezrinterface muss eh auf einen DX-Fullscreen umgepflanzt werden. Daher ist mir das bisherige ziemlich egal.
mfg