Direkter Soundkartenzugriff?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Sensenwerk

Betreff: Direkter Soundkartenzugriff?

BeitragDo, März 23, 2006 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Da ich mich momentan sehr für Synthesizer interessier, habe ich einen kleinen Oszillator programmiert. Der ist bisher natürlich nur grafisch.
Jetzt würde es mich interessieren, ob es irgendwie - am besten nicht zu kompliziert ... - möglich ist, der Soundkarte direkt ein Signal zu schicken. Wenn ich mich richtig erinner hab ich mal etwas entsprechendes mit BlitzMax verwirklicht gesehn (glaube offizielle BMax Seite), find's aber leider nicht mehr.

Alternativ würde ich mich auch freuen, wenn mir jemand das WAV Dateiformat genau erklären könnte, am besten wie man mit Blitzmax eine einfach Wavdatei erzeugt.
Habe mir bei Wikipedia dazu mal das entsprechende durchgelesen, es jedoch nicht wirklich verstanden. Vor allem die genaue Umsetzung, wie man eben dann die einzelnen Werte in die Datei eintragen muss (mit Hilfe von BM am besten, mit einem Hexeditor wäre auch ok) ist mir nach wie vor schleierhaft.

Gegrüßt...
L'enfer, c'est les autres. (Jean Paul Sartre)

Havoc ~40% done

Sensenwerk.eu

Hummelpups

BeitragDo, März 23, 2006 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Import axe.portaudio


Global astream:Byte Ptr

''''''''''''''''''''''''' stuff missing from port audio
Extern
   Function Pa_GetDefaultOutputDeviceID:Int()
EndExtern

Const paInt8   :Int=32
Const paUInt8   :Int=64
Const paInt16   :Int=2
'''''''''''''''''''''''''' end of missing stuff

Graphics 640,480

Global buf:Float[256]

error( Pa_Initialize() ,"init")

' set the mix buffer running....
playstreamPA(astream,myCallback)   


While Not KeyDown(key_escape)


      Cls
      For Local n:Int=0 To 255

         DrawLine 320,n+100,320+buf[n],n+100
      Next

      Flip


Wend


Pa_CloseStream(astream)

End



Function myCallback:Int( inputBuffer:Float Ptr, outputBuffer:Short Ptr,..
    framesPerBuffer:Int,outTime:Double, userData:Byte Ptr )
   For Local n:Int=0 To 255
      buf[n]=inputBuffer[0]*128
      inputbuffer:+1
   Next
EndFunction





Function error(e:Int,s:String)
   If e=0 Then Return
   Pa_Terminate()
   Print "error "+e+" in "+s
   Print "message "+String.FromCString(Pa_GetErrorText(e))
   End
EndFunction   


Function playstreamPA(stream:Byte Ptr Var,callback:Byte Ptr)

   error(..
   Pa_OpenStream( Varptr stream,Pa_GetDefaultOutputDeviceID(),2,paFloat32,Null,..
                  paNoDevice,0,paInt8,Null,44100,256,0,paClipOff,..
                                Callback,Null )..
   ,"open stream")   
   
   error( Pa_StartStream( stream ),"start stream" )
   Print "playing"



EndFunction



Damit kannste schon mal lesen, weiß nich obs richitg ist.
guck dir mal axe.portaudio an.
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Sensenwerk

Betreff: ein Synthesizerchen

BeitragMo, Apr 10, 2006 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, hab jetzt mit audiosample was hinbekommen.
Iss ganz putzig, allerdings insgesamt doch ziemlich buggy, werd's vielleicht mal neu schreiben mit besserer Soundauflösung und direkt den Sound gestreamt.
Hier der Download für die Windows Version:
Osc2_1c_W.exe

Das Programm:
Es handelt sich um eine Art sehr basic Synthesizer, der nur sehr niederfrequente (~ max. 130 Hz) Töne zulässt. Das liegt an meiner schlechten, bilderwiederholratenabhängigen Programmierung. Wie unten erwähnt: hab ich vor irgendwann zu verbessern.
Es kann eine begrenzte Anzahl an Oszillatoren erstellt werden, die dann entweder additiv (durchschnitt) oder multiplikativ - Wortschöpfung? ; ) - miteinander gekoppelt werden.

Das am meisten einschränkende Element ist die Tatsache, dass durch drücken der Leertaste (Soundstart/-stopp) nur die bei JOINTED WAVE im Augenblick des Leertastendrucks angezeigte Welle gelooped wird. Diese ist ziemlich genau eine Sekunde lang.

Die komplette Steuerung:
Tasten 1 bis 7: mit ihnen können die verschiedenen Kurven in den Bearbeitungsmodus geschalten werden.
X beendet den Berabeitungsmodus.
- Die beiden linken SHIFT Tasten steuern die Amplitude (Lautstärke).
- Mit den Pfeiltasten rauf, runter kann der Generator geändert werden (SINE, SQUARE etc.)
- Mit den Pfeiltasten nach links und rechts kann die Frequenz verändert werden.

Mit SPACE kann wie bereits erwähnt der 'aktuelle' JOINTED WAVE Sound gespielt/gestoppt werden.

ESC zum Beenden.


Kenn mich mit Streams nicht aus, wenn mir jemand ein Beispiel posten könnte, oder auch einfach nur erklären, wie man mit ihnen umgeht und ob sie überhaupt das richtige wären, um den Sound der momentan angezeigten 'Welle' sozusagen live auszugeben, wäre ich sehr erfreut. ;)

Gegrüßt
L'enfer, c'est les autres. (Jean Paul Sartre)

Havoc ~40% done

Sensenwerk.eu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group