[Monkey] Soundprogrammierung in Monkey

Übersicht Andere Programmiersprachen Beginners-Corner

Neue Antwort erstellen

 

danibert

Betreff: Soundprogrammierung in Monkey

BeitragFr, Jul 14, 2017 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

kann man mit Monkey so etwas wie einen Soundgenerator mit verschiedenen Wellenformen programmieren?
Gibt es Befehle, mit denen man z.B. eine Sinuswelle oder Sägezahn ausgeben kann? Für mein konkretes Projekt müsste man die Wellenformen auch in sehr feinen Stufen überblenden können.

Geht sowas?
Danke schon mal

Midimaster

BeitragSa, Jul 15, 2017 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Soundmöglichkeiten sind bei Monkey eher sporadisch. Ich habe die Erfahrung gemacht, dass bereits mehrere gleichzeitig laufende Samples zu Aussetzern und Soundproblemen führen können. Eine Manipulation auf Sampleebene halte ich für ausgeschlossen.

Bei BlitzMax ist dies gar kein Problem, da sich OpenAl einbinden lässt. Wahrscheinlich reicht die Performance sogar ohne OpenAl aus, um Waveformen in Echtzeit zu erstellen und an das PlaySound() zu übergeben.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

danibert

BeitragSa, Jul 15, 2017 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@midimaster
Danke für die Info. Mit BlitzMax habe ich vor einiger Zeit schon gearbeitet, allerdings noch nicht in Richtung Sound. Ich würde meinen Soundgenerator gerne mit "unsauberen" Wellenformen ausstatten, also keine perfekt berechneten Wellen, sondern mit diversen Unregelmäßigkeiten, wie man sie von analogen Audioschaltungen kennt.
Hast Du hier einen Tipp für mich, wie ich das am besten angehe?

Midimaster

BeitragSo, Jul 16, 2017 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte da mal ein eigenes Projekt geschrieben. Ein Soundgenerator mit 5 Osszilatoren:

HoerenSehen-Maschine

Daraus kann ich Dir ja mal die Routine zum Erstellen der Sample zeigen:
BlitzMax: [AUSKLAPPEN]
Global MaxWert#,Channel1:TChannel,Channel2:TChannel
Global Wert#[44100],RohWert#[44100]
Const SINUS%=0,RECHTECK%=1,SAEGE%=2


Global sample:TAudioSample=CreateAudioSample( 44100,44100,SF_MONO8 )
sound:TSound=LoadSound( sample,True )




While Not AppTerminate() 'Or Not Confirm( translation("Programm beenden") + "?" )

' Erstellen der Wellenformen:
For k=0 Until 44100
locWert=0
WellenForm=SINUS
Local Hertz#=440.0

If WellenForm=SINUS Then
locWert=locWert+Sin(k/44100*360*Hertz)/100
ElseIf WellenForm=RECHTECK Then
locWert=locWert+Sgn(Sin(k/44100*360*Hertz))/100
ElseIf WellenForm=SAEGE Then
locWert=locWert + (-1 + 2*(k Mod (44100/hertz))/(44100/hertz))/100
EndIf
EndIf
Next

If locwert>maxwert Then
maxwert=locwert
EndIf
Wert[k]=locwert
RohWert[k]=locwert
Next

' Normalisieren auf 100% Volumen und Clipping auf auf Bereich -1 bis +1:
For k=0 Until 44100
RohWert[k]=RohWert[k]/maxwert
If rohwert[k]>1 Then rohwert[K]=1
If rohwert[k]<-1 Then rohwert[K]=-1
Next



'aus dem Rohwert ein Sample erstellen
For k=0 Until 44100
sample.samples[k]=(RohWert[k]*127.0+128) Mod 256
Next


' altes Sample wegen Knacksern ausblenden
For Local hh#=stumm*GesamtVolume To 0 Step -3
SetChannelVolume Channel1,hh/100
Delay 1
Next

' Sound aus Sample erzeugen
sound:TSound=LoadSound( sample,True )


StopChannel Channel1
channel1=CueSound(sound)



SetChannelVolume Channel1,0

ResumeChannel Channel1

' neues Sample wegen Knacksern einblenden
For Local hh#=0 To stumm*GesamtVolume Step 3
SetChannelVolume Channel1,hh/100
Delay 1
Next
EndIf

Delay 1
Flip 0
WaitTimer fps
Wend
'Forever

Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group