Musik-Import-Paket (V.A0.6 buggy)

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

D2006

Administrator

Betreff: Musik-Import-Paket (V.A0.6 buggy)

BeitragDi, Dez 23, 2003 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,

für alle die, die sich für ihre Spiele keine Gedanken um die Musik machen wollen, habe ich folgende Include-Datei gecodet. Sie ähnelt einigen Zusatzfeatures von anderen Spielen, wo der Spieler seine eigenen Mp3-Lieder in ein Verzeichnis legen kann.

Im Programm reichen ein paar Funktionsaufrufe aus, um ein bestimmtes Verzeichnis auszulesen und die entsprechenden Lieder zu verwalten.

Features:
Arrow Angabe des Verzeichnisses
Arrow einfach Ein-/Ausschalten von Unterstützung der wichtigsten in BB gängigen Soundformate (auf Wunsch auch mehr)
Arrow alle wichtigen Funktionen (PLAY,PAUSE,STOP,SKIP)
Arrow volle ID3 Unterstützung bei Mp3-Dateien (ID3v1 und v2 !!!)
Arrow auf Wunsch wird eine TXT-Liste mit den Files erstellt

Also, hier das Includefile:

MIP.bb
BlitzBasic: [AUSKLAPPEN]

;############# MUSIK IMPORT (Include)
;############# Für Spiele aller Art
;############# Zum Einbinden von Musikdateien durch den Spieler
;############# Freeware, Version 0.6, © Daniel Liebetrau

Global MIP_stat=0, MIP_cur=0
Global MIP_Channel ;Soundchannel für Ausgabe
Global MIP_max=1000, MIP_found ;notwendig, MIP_max maximale Anzahl der zugelassenen Lieder
Dim MIP_Tracklist$(MIP_max) ;notwendig





;INIT Funktion --> zuerst aufrufen

Function MIP_INIT(dir$,mp3,ogg,wma,wav,midi,list)
Local direc,file$,ext$,t,l_f
; mp3,ogg,wma,wav,midi: Dateiformate -> 1 für Unterstützung, 0 für keine Unterstützung
; list -> 0 / 1 für keine liste / liste

If list Then l_f= WriteFile(dir$+\"\\"+\"Tracklist.txt\")
direc = ReadDir(dir$)
Repeat
file$=NextFile$(direc)
t=0
If FileType(dir$+\"\\"+file$)=1 Then
ext$ = Upper$(Right$(file$,3))
If ext$=\"MP3\" And mp3 Then t=1
If ext$=\"OGG\" And ogg Then t=1
If ext$=\"WMA\" And wma Then t=1
If ext$=\"WAV\" And wav Then t=1
If ext$=\"MID\" And midi Then t=1
If t=1 Then
MIP_Tracklist$(MIP_found)=dir$+\"\\"+file$
MIP_found=MIP_found+1
EndIf
EndIf
If list Then
If t=1 Then WriteLine l_f,LSet(file$,50)+\" supported\"
If t=0 Then WriteLine l_f,LSet(file$,50)+\" not supported\"
EndIf
If MIP_found=MIP_max+1 Then Exit
Until file$=\"\"
CloseDir direc
If list Then
WriteLine l_f,\"\"
WriteLine l_f,\"number of supported files: \"+MIP_found
WriteLine l_f,\"\"
WriteLine l_f,\"Musik Import Paket, ©2003, Daniel Liebetrau\"
CloseFile l_f
EndIf
If MIP_found > 0 Then MIP_stat=2
Return MIP_found
End Function

;DO Funktion --> um Aktion auszuführen
;Rückgabe eines Strings

;Parameterliste:
;PLAY,Tracknummer (0 -> Zufall) * -> Wiedergabe starten
;PAUSE,0 -> pausieren
;RESUME,0 -> fortfahren
;STOP,0 -> stoppen
;NEXT,Tracknummer (0 -> Zufall),(-1 -> nächstes) * -> nächstes Lied
;INFO,a a=..
; 1 Intepret (bei Mp3) \
; 2 Titel (bei Mp3) > wenn kein ID3 Tag oder kein Eintrag im ID3v2 -> \"ERR\"
; 3 Album (bei Mp3) /
; 4 Dateiname (bei allen, ohne Endung)
;STAT,0 Rückgabe:
; \"playing\" od. \"stopped\" od. \"paused\"

; Parameter mit * geben eines der folgenden Typen zurück: \"mp3\",\"ogg\",\"wma\",\"wav\",\"mid\" oder \"ERR\" bei einem Fehler
Function MIP_DO$(order$,value)
Local ret$, id3, r$,t

Select Upper$(order$)
Case \"PLAY\"
If ChannelPlaying(MIP_Channel)=0 Then MIP_stat=2
If MIP_stat=2 Then
If value=0 Or value>MIP_found Then value=Rand(1,MIP_found)
MIP_Channel = PlayMusic(MIP_Tracklist$(value-1))
MIP_stat=1
MIP_cur=value
EndIf
ret$=Lower$(Right$(MIP_Tracklist$(value-1),3))
Case \"PAUSE\"
If MIP_stat=1 Then
PauseChannel MIP_Channel
MIP_stat=3
EndIf
Case \"RESUME\"
If MIP_stat=3 Then
ResumeChannel MIP_Channel
MIP_stat=1
EndIf
Case \"STOP\"
If MIP_stat=1 Or MIP_stat=3 Then
StopChannel MIP_Channel
MIP_stat=2
EndIf
Case \"NEXT\"
If MIP_stat=1 Or MIP_stat=3 Then
StopChannel MIP_Channel
If value=-1 Then value = MIP_cur + 1
If value=0 Or value>MIP_found Then value=Rand(1,MIP_found)
MIP_Channel = PlayMusic(MIP_Tracklist$(value-1))
MIP_cur=value
ret$=Lower$(Right$(MIP_Tracklist$(value-1),3))
EndIf
Case \"INFO\"
If Upper$(Right$(MIP_Tracklist$(MIP_cur-1),3)) = \"MP3\" And value < 4
id3 = MIP_GET_ID3_TAGS()
If id3=0 Then ret$=\"ERR\"
If id3 > 0 Then
Select value
Case 1
If id3=2 Then
ret$=MIP_ID3V2$(\"TPE1\")
Else
ret$=MIP_ID3V1$(2)
EndIf
Case 2
If id3=2 Then
ret$=MIP_ID3V2$(\"TIT2\")
Else
ret$=MIP_ID3V1$(1)
EndIf
Case 3
If id3=2 Then
ret$=MIP_ID3V2$(\"TALB\")
Else
ret$=MIP_ID3V1$(3)
EndIf
End Select
EndIf
Else
If value<4 Then ret$=\"ERR\"
EndIf
If value=4 Then
ret$=MIP_Tracklist$(MIP_cur-1)
For t=1 To Len(ret$)
r$=Mid$(ret$,Len(ret$)-t,1)
If r$=\"\\" Then Exit
Next
ret$ = Right$(ret$,t)
ret$ = Left$(ret$,Len(ret$)-4)
EndIf
Case \"STAT\"
Select MIP_stat
Case 1:ret$=\"playing\"
Case 2:ret$=\"stopped\"
Case 3:ret$=\"paused\"
End Select
End Select
Return ret$
End Function

;Folgende Funktionen nicht vom Programm aufrufen:

Function MIP_GET_ID3_TAGS()
Local id3=0,file$,dat$,fil,pos,t
file$=MIP_Tracklist$(MIP_cur-1)
pos=FileSize(file$)
fil=ReadFile(file$)
SeekFile(fil,pos-128)
For t=0 To 2
dat$=dat$+Chr$(ReadByte(fil))
Next
If dat$=\"TAG\" Then id3=1
CloseFile fil
fil=ReadFile(file$)
dat$=\"\"
For t=0 To 2
dat$=dat$+Chr$(ReadByte(fil))
Next
If dat$=\"ID3\" Then id3=2
CloseFile fil
Return id3
End Function

Function MIP_ID3V1$(val)
Local file$,fil,dat$,t,tag$,pos,g$
val=((val-1) * 30) + 3
If val=3 Then val=4
file$=MIP_Tracklist$(MIP_cur-1)
pos=FileSize(file$)
fil=ReadFile(file$)
SeekFile(fil,pos-128)
For t=0 To 126
tag$=tag$+Chr$(ReadByte(fil))
Next
CloseFile fil
dat$=Mid$(tag$,val,29)
Return Trim$(dat$)
End Function

Function MIP_ID3V2$(ID$)
Local file$,fil,dat$=\"\",t,tag$=\"\",a,b,c,d$
file$=MIP_Tracklist$(MIP_cur-1)
fil=ReadFile(file$)
For t=1 To 500
tag$=tag$+Chr$(ReadByte(fil))
Next
a = Instr(tag$,ID$)
If a=0 Then Return \"ERR\"
b = Asc(Mid$(tag$,a+7,1))
For c=1 To b
d$=Mid$(tag$,a+9+c,1)
If Asc(d$)>31 Then dat$ = dat$+d$
Next
Return Trim$(dat$)
End Function


Hier ein Beispielcode:
BlitzBasic: [AUSKLAPPEN]


Graphics 1024,768,32,3

dir$ = \"D:\Music\Mp3\"

Include \"MIP.bb\"

Cls
Color 255,255,255

SeedRnd MilliSecs()

init = MIP_INIT(dir$,1,0,0,1,0,0)
AppTitle \"MIP_Test!\"
If Not init Then RuntimeError \"Kein Lied im Verzeichnis!\"



MIP_DO(\"play\",0)

art$ = MIP_DO(\"info\",1)
tit$ = MIP_DO(\"info\",2)
alb$ = MIP_DO(\"info\",3)

While Not KeyHit(1)
Cls

Text 10,10,\"gefundene Mp3-Dateien: \"+MIP_found

Text 10,50,art$+\" - \"+tit$+\" aus \"+alb$
Text 10,75,MIP_DO(\"stat\",0)
Text 10,100,MIP_DO(\"info\",4)
Text 10,120,MIP_cur +\" von \"+MIP_found
Flip

h=0
If KeyHit(203) Then MIP_DO(\"next\",MIP_cur-1):h=1 ;vorheriger Song
If KeyHit(205) Then MIP_DO(\"next\",-1):h=1 ;nächster Song
If KeyHit(57) Then MIP_DO(\"next\",0):h=1 ;Zufall

If h=1 Then
art$ = MIP_DO(\"info\",1)
tit$ = MIP_DO(\"info\",2)
alb$ = MIP_DO(\"info\",3)
EndIf

Wend
End


Bei größeren Interesse wär ich natürlich bereit, ausführlichere Erklärungen zu geben.
Ich fänds supi, wenn ihr das auf Bugs durchsuchen könnt. Bei mir kann man z.B. keine Mp3's mehr hören, wenn man vorher ein WMA angehört hat.

THX

Frohes Fest
D2006
  • Zuletzt bearbeitet von D2006 am Mo, Mai 23, 2005 23:16, insgesamt einmal bearbeitet
 

Apocalyptic

Betreff: Re: Musik-Import-Paket (V.A0.6 buggy)

BeitragDo, Dez 25, 2003 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
D2006 hat Folgendes geschrieben:
Ich fänds supi, wenn ihr das auf Bugs durchsuchen könnt. Bei mir kann man z.B. keine Mp3's mehr hören, wenn man vorher ein WMA angehört hat.


Hm, bei WMAs und BB hab ich nur schlechte Erfahrungen... z.B. funktioniert Channelplaying mit WMAs bei mir nicht, d.h. ich kann nicht überprüfen, wann die zuende sind, weil immer 1 zurückgeliefert wird, selbst wenn die schon lange aus sind. Und dann werden manche bei mir erst gar nicht abgespielt. Ich code zur Zeit nämlich an einem Music Player (nur zum Spaß Wink ), und WMAs kann man bei dem total vergessen...

Ich hab mir deinen Code noch nicht angeschaut, aber Danke für die ID3 Tags Very Happy Die werde ich bestimmt gebrauchen können, hab mich selber mal daran versucht, hat aber nicht immer funktioniert. Funktionieren die bei deinem Code auch, wenn Bilder, Songtexte usw. mit drinnen sind?

Edit:

Ich habs jetzt ausprobiert, bei allen MP3s mit Cover funktioniert der ID3 Tag nicht. Genau an dem Problem bin ich auch gescheitert, da die Informationen über Interpret, Titel usw. nicht mehr in den letzten 128 Byte gespeichert sind...

Aber ansonsten funktioniert alles.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

D2006

Administrator

BeitragFr, Dez 26, 2003 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
MP3' mit Cover??

Also, wenn Bilder drin sind, könnte es Probleme geben, weil die recht groß sind und für die Titel, Interpreten - Suche nur die ersten 500 Byte ausgelesen werden.

Kannst du aber leicht ändern:
einfach in der Funktion MIP_ID3V2$(ID$)
die Schleife "For t=1 to 500" ändern.

Die Funktion kannst du auch einzeln verwenden. Du musst
als ID$ einfach einen der folgenden Codes eingeben:

Zitat:

IPLS : Involved people list
MCDI : Music CD identifier
PCNT : Play counter
TALB : Album/Movie/Show title
TBPM : BPM (beats per minute)
TCOM : Composer
TCON : Content type
TCOP : Copyright message
TDAT : Date
TDLY : Playlist delay
TENC : Encoded by
TEXT : Lyricist/Text writer
TFLT : File type
TIME : Time
TIT1 : Content group description
TIT2 : Title/songname/content description
TIT3 : Subtitle/Description refinement
TKEY : Initial key
TLAN : Language(s)
TLEN : Length
TMED : Media type
TOAL : Original album/movie/show title
TOFN : Original filename
TOLY : Original lyricist(s)/text writer(s)
TOPE : Original artist(s)/performer(s)
TORY : Original release year
TOWN : File owner/licensee
TPE1 : Lead performer(s)/Soloist(s)
TPE2 : Band/orchestra/accompaniment
TPE3 : Conductor/performer refinement
TPE4 : Interpreted, remixed, or otherwise modified by
TPOS : Part of a set
TPUB : Publisher
TRCK : Track number/Position in set
TRDA : Recording dates
TRSN : Internet radio station name
TRSO : Internet radio station owner
TSIZ : Size
TSRC : ISRC (international standard recording code)
TSSE : Software/Hardware and settings used for encoding
TYER : Year
WCOM : Commercial information
WCOP : Copyright/Legal information
WOAF : Official audio file webpage
WOAR : Official artist/performer webpage
WOAS : Official audio source webpage
WORS : Official internet radio station homepage
WPAY : Payment
WPUB : Publishers official webpage


[Wenn du die allein verwenden willst, musst du sie noch umschreiben...]

MfG

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group