Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Multimedia

Spielereien mit der BASS.dll

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.RedakteurVolta 19.04.2012

Hi,
angeregt durch diesen Externer Link!Thread im FB-Forum und diese Externer Link!guten Tutorials bin ich auf die Idee gekommen so etwas auch in FB zu versuchen.

Frequenzmessung

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
  • Das Code-Beispiel wurde am 15.01.2009 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 19.04.2012 von AdministratorSebastian gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen