TAudioSample

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Phlox

Betreff: TAudioSample

BeitragDo, Okt 07, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich weiß, ich war lange nicht mehr hier, hatte immer ziemlich viel zu tun..
Also im Moment habe ich folgendes Problem: Ich habe eine ganze Reihe von Frequenzen (von 28 bis 4186 Hz) aus einer Datei und möchte die gerne abspielen. Dabei bin ich im Internet nicht fündig geworden, allerdings habe ich Ansätze:

BlitzMax: [AUSKLAPPEN]
Local sample:TAudioSample=CreateAudioSample(41,11025,SF_MONO8)
For Local k:Int=0 To 41
sample.samples[k]=Sin(k*360/42)*120+120
Next
Local beepsound:TSound=LoadSound(sample,True)

Function DoBeep(snd:TSound,length:Int,note:Float)
Local chan:TChannel
Local rate:Float=2^(note/12)
chan=PlaySound(snd)
SetChannelRate(chan,rate)
Delay length
StopChannel(chan)
End Function


Wenn ich der Funktion jetzt direkt die Zahlen gebe bekomme ich viel zu hohe Töne. Ich habe es schon mit teilen bzw. subtrahieren versucht, dann stimmt aber alles nicht mehr.

Frage: Weiß jemand, wie ich sowas am besten mache? Mit Audio in BlitzMax kenn ich mich nicht so aus und das wird in der Doku auch nicht so richtig beschrieben...

Also im Prinzip brauch ich sowas wie "Beep" unter Windows, nur halt plattformunabhängig.


TIA
Phlox

mpmxyz

BeitragFr, Okt 08, 2010 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst den Sound als Loop-Sound erstellen, da er sonst nicht lange genug abgespielt wird. (SOUND_LOOP als flag)
Um den Sinus in der richtigen Frequenz zu haben, brauchst du die richtigen Faktoren:
BlitzMax: [AUSKLAPPEN]
Sin(k*360*frequenz/samplerate)

mfG
mpmxyz
PS: Der Sound muss auch die richtige Länge haben, damit es keine Knackgeräusche gibt.
Code: [AUSKLAPPEN]
k*frequenz/samplerate+1=(k+länge)*frequenz/samplerate
=> länge=samplerate/frequenz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Phlox

BeitragFr, Okt 08, 2010 22:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, jetzt verstehe ich überhaupt nichts mehr. Ich glaub, das ist mir zu kompliziert.. Embarassed
Gibt es nicht einfach eine "Beep"-Funktion?


TIA
Phlox

mpmxyz

BeitragFr, Okt 08, 2010 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Du warst nah dran:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Const freq:Int=280
Const sampleRate:Int=11025
Const length:Int=sampleRate/freq

Local sample:TAudioSample=CreateAudioSample(length,11025,SF_MONO8)
For Local k:Int=0 Until length
sample.samples[k]=Sin(k*360*freq/sampleRate)*120+120
Next
Local beepsound:TSound=LoadSound(sample,SOUND_LOOP|SOUND_HARDWARE)

Function DoBeep(snd:TSound,length:Int,note:Float)
Local chan:TChannel
Local rate:Float=2.0^(note/12.0)
chan=PlaySound(snd)
SetChannelRate(chan,rate)
Delay length
StopChannel(chan)
EndFunction

DoBeep(beepsound,1000,0)
DoBeep(beepsound,1000,12)
DoBeep(beepsound,100,-12)
DoBeep(beepsound,100,12)

Wenn du ein paar Millisekunden am Ende als "Abklingzeit" nutzt, gibt es dort auch kein störendes Knacken.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Phlox

BeitragFr, Okt 08, 2010 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso, da muss ich doch immer noch die "Noten" angeben, also in Tönen in Relation zu 280 Hz...
Wie soll ich dass denn berechnen?

Ich hab nur die Frequenzen, die ich erzeugen will...


TIA


EDIT:
Hab's doch geschafft, vielen Dank!!

BlitzMoritz

Betreff: Keyboard-Spielerei

BeitragSo, Okt 17, 2010 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, aber das hat mich jetzt gerade 'mal gereizt, ein kleines mit der Tastatur zu spielendes Mini-Keyboard zu basteln, allerdings nur einstimmig. Die Klänge übereinanderzulegen hörte sich zu mies an.
BlitzMax: [AUSKLAPPEN]
SuperStrict
AppTitle = "Mini-Keyboard"
Graphics 400,60
DrawText "Schwarze Tasten: W E T Z U O P", 20, 10
DrawText " Weisse Tasten: A S D F G H J K L", 20, 30
Flip
Const freq:Int=280
Const sampleRate:Int=11025
Const length:Int=sampleRate/freq
Local sample:TAudioSample=CreateAudioSample(length,11025,SF_MONO8)
For Local k:Int=0 Until length
sample.samples[k]=Sin(k*360*freq/sampleRate)*120+120
Next
Local chan:TChannel, beepsound:TSound=LoadSound(sample,SOUND_LOOP|SOUND_HARDWARE)
Local timer:TTimer = CreateTimer(60)
Local keycode:Int[] = [KEY_A, KEY_W, KEY_S, KEY_E, KEY_D, KEY_F, KEY_T, KEY_G, KEY_Z, KEY_H, KEY_U, KEY_J, KEY_K, KEY_O, KEY_L, KEY_P]
Repeat
Local key_action:Byte = False
For Local key:Int = 0 To 15
If KeyHit(keycode[key]) Then
If chan <> Null And ChannelPlaying(chan) Then StopChannel(chan)
Local rate:Float=2.0^(key/12.0)
chan=PlaySound(beepsound)
SetChannelRate(chan,rate)
key_action = True
ElseIf KeyDown(keycode[key]) Then
key_action = True
End If
Next
If key_action = False And chan <> Null And ChannelPlaying(chan) Then StopChannel(chan)
WaitTimer(timer)
Until KeyDown(KEY_ESCAPE)
End

Lord Stweccys

BeitragSo, Okt 17, 2010 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
...und ich hab prompt eine Melodie dazu (alle Töne gleichlang spielen):

gfgzgfeesefgeseegfgzukzzfgzugfggsefgesa


(hoffe, dass es euch gefällt, ich mich nicht verschrieben habe und, dass es nicht allzu schwierig ist Smile )

PS: Die Melodie hab ich nach Gehör übernommen von Harry Potter und der Halbplutprinz

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group