Code-Beispiel
Spielereien mit der BASS.dll
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | Volta | 19.04.2012 |
Hi,
angeregt durch diesen Thread im FB-Forum und diese guten Tutorials bin ich auf die Idee gekommen so etwas auch in FB zu versuchen.
Erste Versuche:
(eine eigene mp3-Datei wird benötigt -> "meine.mp3")
'fast ein Osziloskop mit BASS
'mit BASS.dll 2.03 vom 12.06.2006
'bass.bi (2.0) aus FB 0.21b vom 23.12.2008
'libbass.dll.a vom 13.01.2006
'von Volta auf AMD Sempron unter ME getestet
#Include Once "bass.bi"
Const Dateiname = "meine.mp3"
Type Stereo Field =2
Li As Short' 16 Bit mit Vorzeichen
Re As Short' 16 Bit mit Vorzeichen
End Type
Dim S_Buffer(512-1) As Stereo
Dim As Integer erg, i, j, peak
Dim As ULongInt v
Screen 18,32',,1
If( HiWord(BASS_GetVersion()) < &H202 ) Then '&H204 = Version 2.04
Print "Falsche version der BASS.dll geladen!":Sleep
End
End If
If( BASS_Init( -1, 44100, 0, 0, 0 ) = 0 ) Then
BASS_Free' Im Fehlerfall sicherheitshalber Ressourcen freigeben.
Print "Wiedergabe kann nicht gestartet werden!":Sleep
End
End If
'Dim As HMUSIC Test 'für MOD - Dateien
'Test = BASS_MusicLoad( 0, Dateiname, 0, 0, BASS_MUSIC_LOOP, 0 )
Dim As HSTREAM Test ' für WAV, mp3
Test = BASS_StreamCreateFile(0, Dateiname, 0, 0, BASS_STREAM_AUTOFREE)
If( Test = 0 ) Then
BASS_Free' Im Fehlerfall sicherheitshalber Ressourcen freigeben.
Print Dateiname & " kann nicht gestartet werden!":Sleep
End 1
End If
Print "Wiedergabe stoppt bei Tastendruck..."
BASS_ChannelPlay( Test, FALSE )
'Grafik
Do
erg = BASS_ChannelGetData( Test, @S_Buffer(0), 2048 )
If erg <> 2048 Then Exit Do '2048 Byte im Buffer?
v = BASS_ChannelGetPosition(Test)
peak = BASS_ChannelGetLevel(Test)
ScreenLock 'Auswertung
Line (0,40) - (550,479),&H202040,bf 'pseudo Cls
Line (10,170) - (20,170-(HiWord(peak) Shr 8)),&H00FF00,bf'Peak recht
Line (10,350) - (20,350-(LoWord(peak) Shr 8)),&HFFFF00,bf'Peak links
For i= 0 To 254 'zeichnet Signalverlauf
j = i*2 +30
Line (j,(S_Buffer(i).Re Shr 8)+170)-(j+1,(S_Buffer(i+1).Re Shr 8)+170),&H00FF00
Line (j,(S_Buffer(i).Li Shr 8)+350)-(j+1,(S_Buffer(i+1).Li Shr 8)+350),&HFFFF00
Next
ScreenUnLock
ScreenSync 'Wichtig! nicht entfernen
Sleep 1
Loop While InKey=""
BASS_ChannelStop( Test )
BASS_Stop
BASS_Free
Locate 1,1 : Print "Ende bei Tastendruck... "
sleep
und
'quasi Frequenzpegelanzeige mit BASS
'mit BASS.dll 2.03 vom 12.06.2006
'bass.bi (2.0) aus FB 0.21b vom 23.12.2008
'libbass.dll.a vom 13.01.2006
'von Volta auf AMD Sempron unter ME getestet.
#Include Once "bass.bi"
Const Dateiname = "meine.mp3"
Dim fft(256-1) As Single
Dim As Integer erg, i, j, s
Dim As LongInt v
Screen 18,32,,1
If( HiWord(BASS_GetVersion()) < &H202 ) Then '&H204 = Version 2.04
Print "Falsche version der BASS.dll geladen!":Sleep
End
End If
If( BASS_Init( -1, 44100, 0, 0, 0 ) = 0 ) Then
BASS_Free' Im Fehlerfall sicherheitshalber Ressourcen freigeben.
Print "Wiedergabe kann nicht gestartet werden!":Sleep
End
End If
'Dim As HMUSIC Test 'für MOD - Dateien
'Test = BASS_MusicLoad( 0, Dateiname, 0, 0, BASS_MUSIC_LOOP, 0 )
Dim As HSTREAM Test ' für WAV, mp3
Test = BASS_StreamCreateFile(0, Dateiname, 0, 0, BASS_STREAM_AUTOFREE)
If( Test = 0 ) Then
BASS_Free' Im Fehlerfall sicherheitshalber Ressourcen freigeben.
Print Dateiname & " kann nicht gestartet werden!":Sleep
End 1
End If
Print "Wiedergabe stoppt bei Tastendruck..."
BASS_ChannelPlay( Test, FALSE )
'Grafik
Do
erg = BASS_ChannelGetData( Test, @fft(0), BASS_DATA_FFT512 )
If erg <> 2048 Then Exit Do '2048 Byte im Buffer?
v = BASS_ChannelGetPosition(Test)
S = (v Shr 16)
ScreenLock 'Auswertung
Line (1,15) - (s,32),&HA00000+(s Shl 8),b'Fortschrittsbalken
Locate 2,2 : Print v
Line (0,40) - (639,479),&HD0B0B0,bf 'pseudo Cls
For i= 1 To 55 'Balken zeichnen nur untere Werte
j = i*11
Line (j,470)-(j+9, 470-(fft(i)*430)),fft(i)*&HFFFF00,bf
Next
ScreenUnLock
ScreenSync 'Wichtig! nicht entfernen
Sleep 1
Loop While InKey=""
BASS_ChannelStop( Test )
BASS_Stop
BASS_Free
Locate 1,1 : Print "Ende bei Tastendruck... "
sleep
Viel Spaß damit
Volta
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|