Иногда в компьютерных играх хочется поменять музыку на что-то свое. Для этого приходится конвертировать и переименовывать свои музыкальные файлы под игровые. И добавлять путем их замены.
Например как в "Героях 3"
Но приятно когда можно только скопировать любимую музыку в игровую папку, ничего не переделывая, И она без проблем воспроизводилась.
Например как в TES4: Oblivion или частично GTA San Andreas
Чтобы музыка в ваших играх ограничивалась только содержимым вашей папки с игровой музыкой, а не конкретным списком, я сделал функцию, которая просканирует указанную папку и запишет пути к каждому музыкальному файлу (.mp3 .wav .ogg) в тип, а еще возвратит количество отсканированного.
;Вся сканированная музыка записывается в type musfile.musfile
Type foldermusic
Field n$
End Type
Type tfoldermusic
Field n$
End Type
Type ynfoldermusic
Field n$
End Type
Type musfile
Field name$ ;путь к файлу
Field n; порядковый номер (можно использовать для перемешивания списка музыки)
End Type
Global cdir$
Function musicscan(musicdir$=".")
nmus=0
For musfile.musfile=Each musfile
Delete musfile
Next
cdir=CurrentDir()
ChangeDir musicdir
foldermusicf()
DebugLog "FOLDERS"
For foldermusic.foldermusic=Each foldermusic
DebugLog foldermusic\n
Next
For foldermusic.foldermusic=Each foldermusic
myDir=ReadDir(foldermusic\n)
Repeat
file$=NextFile$(myDir)
If file$="" Then Exit
If FileType(foldermusic\n+"\"+file$) <> 2
If Right$(file$,4)=".mp3" Or Right$(file$,4)=".wav" Or Right$(file$,4)=".ogg"
nmus=nmus+1
musfile.musfile=New musfile
musfile\name=foldermusic\n+"\"+file$
musfile\n=nmus
EndIf
EndIf
Forever
CloseDir myDir
Next
DebugLog "FILES"
For musfile.musfile=Each musfile
DebugLog musfile\n+" "+musfile\name
Next
DebugLog nmus+" tracks"
For foldermusic.foldermusic=Each foldermusic
Delete foldermusic
Next
For tfoldermusic.tfoldermusic=Each tfoldermusic
Delete tfoldermusic
Next
For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
Delete ynfoldermusic
Next
ChangeDir cdir
Return nmus
End Function
Function foldermusicf(f$=".")
folder$=f$
myDir=ReadDir(folder$)
Repeat
file$=NextFile$(myDir)
If file$="" Then Exit
If FileType(file$) = 2 Then
If file$<>"." And file$<>".."
foldermusic.foldermusic=New foldermusic
foldermusic\n=file$
EndIf
End If
Forever
Repeat
For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
Delete ynfoldermusic
Next
For foldermusic.foldermusic=Each foldermusic
ynfoldermusic.ynfoldermusic=New ynfoldermusic
ynfoldermusic\n=foldermusic\n
Next
okfoldermusic=0
For foldermusic.foldermusic=Each foldermusic
myDir=ReadDir(foldermusic\n)
Repeat
file$=NextFile$(myDir)
If file$<>"." And file$<>".."
If file$="" Then Exit
If FileType(foldermusic\n+"\"+file$) = 2 And ynfoldermusic(foldermusic\n+"\"+file$)=True
okfoldermusic=okfoldermusic+1
tfoldermusic.tfoldermusic=New tfoldermusic
tfoldermusic\n=foldermusic\n+"\"+file$
End If
EndIf
Forever
CloseDir myDir
Next
For tfoldermusic.tfoldermusic=Each tfoldermusic
foldermusic.foldermusic=New foldermusic
foldermusic\n=tfoldermusic\n
Delete tfoldermusic
Next
Until okfoldermusic=0
foldermusic.foldermusic=New foldermusic
foldermusic\n="."
End Function
Function ynfoldermusic(tfl$)
ynf=True
For ynfoldermusic.ynfoldermusic=Each ynfoldermusic
If ynfoldermusic\n=tfl Then ynf=False
Next
Return ynf
End Function
Данный код удобно сохранить в файл, а потом его инклудить
Использование:
Вызвать musicscan(dir$)
где dir$ -путь к папке с игровой музыкой
Затем работать в цикле For musfile.musfile=Each musfile c переменными musfile\n и musfile\name, что соответствует порядковому номеру и пути к каждому музыкальному файлу
Пример:
Include "musicscan.bb"
dir$="data\music\"
nmusic=musicscan(dir)
shuffle=Rand(nmusic)
For musfile.musfile=Each musfile
If musfile\n=shuffle
PlayMusic dir+musfile\name
Print "Now playing: "+musfile\n+" track"
EndIf
Next
WaitKey()
End
В данном примере сканируется папка music функцией scanmusic() и заодно в переменную nmusic записывается количество сканированного. Затем в цикле проигрывается музыка со случайным порядковым номером musfile\n который соответствует пути musfile\name