Code : Tout sélectionner
; *************************
; *** ***
; *** Retro Sound 8Bits ***
; *** ***
; *************************
;
; Flaith 23.02.09
;
; Procedure Makesound from GPI modified for my needs
; (GPI: http://www.purebasic.fr/english/viewtopic.php?p=25292#25292 )
; On commence à octave 2
#TON = 2
#__C = 262/#TON
#_CD = 277/#TON
#__D = 294/#TON
#_DD = 311/#TON
#__E = 330/#TON
#__F = 349/#TON
#_FD = 370/#TON
#__G = 392/#TON
#_GD = 415/#TON
#__A = 440/#TON
#_AD = 466/#TON
#__B = 494/#TON
#WAVE_FORMAT_PCM = $0001
#MONO = $0001
#SAMPLE_RATE = 8000 ; 8000, 11025, 22050, or 44100
#RIFF_ID = "RIFF"
#WAVE_ID = "WAVE"
#FMT_ID = "fmt "
#DATA_ID = "data"
Structure TNOTE
note1.s
note2.s
note3.s
note4.s
EndStructure
Structure TWAVE
wFormatTag.w
nChannels.w
nSamplesPerSec.i
nAvgBytesPerSec.i
nBlockAlign.w
wBitsPerSample.w
cbSize.w
EndStructure
Global *new_snd
Global C2.i,Cd2.i,D2.i,Dd2.i,E2.i,F2.i,Fd2.i,G2.i,Gd2.i,A2.i,Ad2.i,B2.i
Global C3.i,Cd3.i,D3.i,Dd3.i,E3.i,F3.i,Fd3.i,G3.i,Gd3.i,A3.i,Ad3.i,B3.i
Global C4.i,Cd4.i,D4.i,Dd4.i,E4.i,F4.i,Fd4.i,G4.i,Gd4.i,A4.i,Ad4.i,B4.i
Global C5.i,Cd5.i,D5.i,Dd5.i,E5.i,F5.i,Fd5.i,G5.i,Gd5.i,A5.i,Ad5.i,B5.i
Global C6.i,Cd6.i,D6.i,Dd6.i,E6.i,F6.i,Fd6.i,G6.i,Gd6.i,A6.i,Ad6.i,B6.i
Procedure MakeSound(Frequency.f, Duration.i)
Protected SoundValue.b
Protected nr.i
Protected TWaveFormat.i
Protected w.f ; omega ( 2 * pi * frequency)
Protected DataCount.i, RiffCount.i
Protected *MS.i
WaveFormatEx.TWAVE
WaveFormatEx\wFormatTag = #WAVE_FORMAT_PCM
WaveFormatEx\nChannels = #MONO
WaveFormatEx\nSamplesPerSec = #SAMPLE_RATE
WaveFormatEx\wBitsPerSample = $0008
WaveFormatEx\nBlockAlign = (WaveFormatEx\nChannels * WaveFormatEx\wBitsPerSample) / 8
WaveFormatEx\nAvgBytesPerSec = WaveFormatEx\nSamplesPerSec * WaveFormatEx\nBlockAlign
WaveFormatEx\cbSize = 0
DataCount = (Duration * #SAMPLE_RATE)/1000 ; sound data
RiffCount = 4 + 4 + 4 + SizeOf(TWAVE) + 4 + 4 + DataCount
*new_snd=AllocateMemory(RiffCount+100)
*MS=*new_snd
PokeS(*MS,#RIFF_ID):*MS+4 ; 'RIFF'
PokeL(*MS,RiffCount):*MS+4 ; file Data size
PokeS(*MS,#WAVE_ID):*MS+4 ; 'WAVE'
PokeS(*MS,#FMT_ID):*MS+4 ; 'fmt '
TWaveFormat = SizeOf(TWAVE)
PokeL(*MS,TWaveFormat):*MS+4 ; TWaveFormat data size
PokeW(*MS,WaveFormatEx\wFormatTag):*MS+2 ; WaveFormatEx record
PokeW(*MS,WaveFormatEx\nChannels):*MS+2
PokeL(*MS,WaveFormatEx\nSamplesPerSec):*MS+4
PokeL(*MS,WaveFormatEx\nAvgBytesPerSec):*MS+4
PokeW(*MS,WaveFormatEx\nBlockAlign):*MS+2
PokeW(*MS,WaveFormatEx\wBitsPerSample):*MS+2
PokeW(*MS,WaveFormatEx\cbSize):*MS+2
PokeS(*MS,#DATA_ID):*MS+4 ; 'data'
PokeL(*MS,DataCount):*MS+4 ; sound data size
; Calculate And write out the tone signal : now the Data values
w = 2 * #PI * Frequency ; omega
For i = 0 To DataCount - 1
;SoundValue = Frequency * Pow(2,(i / Duration))
SoundValue = 127 + 127 * Sin(i * w / #SAMPLE_RATE)
PokeB(*MS,SoundValue)
*MS+1
Next
nr = CatchSound(#PB_Any,*new_snd)
FreeMemory(*new_snd)
ProcedureReturn nr
EndProcedure
Procedure QuitSound(sound)
StopSound(sound)
FreeSound(sound)
EndProcedure
Procedure InitInstrument(DURATION.i)
C2 = MakeSound(#__C,DURATION)
Cd2= MakeSound(#_CD,DURATION)
D2 = MakeSound(#__D,DURATION)
Dd2= MakeSound(#_DD,DURATION)
E2 = MakeSound(#__E,DURATION)
F2 = MakeSound(#__F,DURATION)
Fd2= MakeSound(#_FD,DURATION)
G2 = MakeSound(#__G,DURATION)
Gd2= MakeSound(#_GD,DURATION)
A2 = MakeSound(#__A,DURATION)
Ad2= MakeSound(#_AD,DURATION)
B2 = MakeSound(#__B,DURATION)
C3 = MakeSound(#__C*2,DURATION)
Cd3= MakeSound(#_CD*2,DURATION)
D3 = MakeSound(#__D*2,DURATION)
Dd3= MakeSound(#_DD*2,DURATION)
E3 = MakeSound(#__E*2,DURATION)
F3 = MakeSound(#__F*2,DURATION)
Fd3= MakeSound(#_FD*2,DURATION)
G3 = MakeSound(#__G*2,DURATION)
Gd3= MakeSound(#_GD*2,DURATION)
A3 = MakeSound(#__A*2,DURATION)
Ad3= MakeSound(#_AD*2,DURATION)
B3 = MakeSound(#__B*2,DURATION)
C4 = MakeSound(#__C*3,DURATION)
Cd4= MakeSound(#_CD*3,DURATION)
D4 = MakeSound(#__D*3,DURATION)
Dd4= MakeSound(#_DD*3,DURATION)
E4 = MakeSound(#__E*3,DURATION)
F4 = MakeSound(#__F*3,DURATION)
Fd4= MakeSound(#_FD*3,DURATION)
G4 = MakeSound(#__G*3,DURATION)
Gd4= MakeSound(#_GD*3,DURATION)
A4 = MakeSound(#__A*3,DURATION)
Ad4= MakeSound(#_AD*3,DURATION)
B4 = MakeSound(#__B*3,DURATION)
C5 = MakeSound(#__C*4,DURATION)
Cd5= MakeSound(#_CD*4,DURATION)
D5 = MakeSound(#__D*4,DURATION)
Dd5= MakeSound(#_DD*4,DURATION)
E5 = MakeSound(#__E*4,DURATION)
F5 = MakeSound(#__F*4,DURATION)
Fd5= MakeSound(#_FD*4,DURATION)
G5 = MakeSound(#__G*4,DURATION)
Gd5= MakeSound(#_GD*4,DURATION)
A5 = MakeSound(#__A*4,DURATION)
Ad5= MakeSound(#_AD*4,DURATION)
B5 = MakeSound(#__B*4,DURATION)
C6 = MakeSound(#__C*5,DURATION)
Cd6= MakeSound(#_CD*5,DURATION)
D6 = MakeSound(#__D*5,DURATION)
Dd6= MakeSound(#_DD*5,DURATION)
E6 = MakeSound(#__E*5,DURATION)
F6 = MakeSound(#__F*5,DURATION)
Fd6= MakeSound(#_FD*5,DURATION)
G6 = MakeSound(#__G*5,DURATION)
Gd6= MakeSound(#_GD*5,DURATION)
A6 = MakeSound(#__A*5,DURATION)
Ad6= MakeSound(#_AD*5,DURATION)
B6 = MakeSound(#__B*5,DURATION)
EndProcedure
Procedure.i getNote(note.s)
Protected valnote.i
Select note
Case "---": valnote = -1
Case "C2" : valnote = C2
Case "C#2": valnote = Cd2
Case "D2" : valnote = D2
Case "D#2": valnote = Dd2
Case "E2" : valnote = E2
Case "F2" : valnote = F2
Case "F#2": valnote = Fd2
Case "G2" : valnote = G2
Case "G#2": valnote = Gd2
Case "A2" : valnote = A2
Case "A#2": valnote = Ad2
Case "B2" : valnote = B2
Case "C3" : valnote = C3
Case "C#3": valnote = Cd3
Case "D3" : valnote = D3
Case "D#3": valnote = Dd3
Case "E3" : valnote = E3
Case "F3" : valnote = F3
Case "F#3": valnote = Fd3
Case "G3" : valnote = G3
Case "G#3": valnote = Gd3
Case "A3" : valnote = A3
Case "A#3": valnote = Ad3
Case "B3" : valnote = B3
Case "C4" : valnote = C4
Case "C#4": valnote = Cd4
Case "D4" : valnote = D4
Case "D#4": valnote = Dd4
Case "E4" : valnote = E4
Case "F4" : valnote = F4
Case "F#4": valnote = Fd4
Case "G4" : valnote = G4
Case "G#4": valnote = Gd4
Case "A4" : valnote = A4
Case "A#4": valnote = Ad4
Case "B4" : valnote = B4
Case "C5" : valnote = C5
Case "C#5": valnote = Cd5
Case "D5" : valnote = D5
Case "D#5": valnote = Dd5
Case "E5" : valnote = E5
Case "F5" : valnote = F5
Case "F#5": valnote = Fd5
Case "G5" : valnote = G5
Case "G#5": valnote = Gd5
Case "A5" : valnote = A5
Case "A#5": valnote = Ad5
Case "B5" : valnote = B5
Case "C6" : valnote = C6
Case "C#6": valnote = Cd6
Case "D6" : valnote = D6
Case "D#6": valnote = Dd6
Case "E6" : valnote = E6
Case "F6" : valnote = F6
Case "F#6": valnote = Fd6
Case "G6" : valnote = G6
Case "G#6": valnote = Gd6
Case "A6" : valnote = A6
Case "A#6": valnote = Ad6
Case "B6" : valnote = B6
EndSelect
ProcedureReturn valnote
EndProcedure
Global DURATION.i
Global Duree.i
InitSound()
Global note1.i, note2.i, note3.i, note4.i
Global NewList channel.TNOTE()
; Restore zelda:
; Restore ghostbuster:
Restore pacman:
; Restore mario:
Read.i DURATION
Read.i Duree
InitInstrument(DURATION*Duree)
Read.s tmp$
While tmp$ <> "END"
Read.s tmp1$
Read.s tmp2$
Read.s tmp3$
AddElement(channel())
channel()\note1 = tmp$
channel()\note2 = tmp1$
channel()\note3 = tmp2$
channel()\note4 = tmp3$
Read.s tmp$
Wend
OpenConsole()
ForEach channel()
note1 = getNote(channel()\note1)
note2 = getNote(channel()\note2)
note3 = getNote(channel()\note3)
note4 = getNote(channel()\note4)
PrintN(LSet(channel()\note1,3," ")+" "+LSet(channel()\note2,3," ")+" "+LSet(channel()\note3,3," ")+" "+LSet(channel()\note4,3," "))
If note1 >= 0
PlaySound(note1,#PB_Sound_MultiChannel)
EndIf
If note2 >= 0
PlaySound(note2,#PB_Sound_MultiChannel)
EndIf
If note3 >= 0
PlaySound(note3,#PB_Sound_MultiChannel)
EndIf
If note4 >= 0
PlaySound(note4,#PB_Sound_MultiChannel)
EndIf
Delay(DURATION*duree)
Next
Print("Hit a key"):Input()
CloseConsole()
End
DataSection
;-pacman:
pacman:
Data.i 60,1
Data.s "B2" ,"B4" ,"---","---" ;0
Data.s "---","---","---","---" ;1
Data.s "---","B5" ,"---","---" ;2
Data.s "---","---","---","---" ;3
Data.s "B3" ,"F#5","---","---" ;4
Data.s "---","---","---","---" ;5
Data.s "---","D5" ,"---","---" ;6
Data.s "---","---","---","---" ;7
Data.s "B2" ,"---","---","---" ;8
Data.s "---","B5" ,"---","---" ;9
Data.s "---","---","---","---" ;0
Data.s "---","F#5","---","---" ;1
Data.s "B3" ,"---","---","---" ;2
Data.s "---","D5" ,"---","---" ;3
Data.s "---","---","---","---" ;4
Data.s "---","---","---","---" ;5
Data.s "---","C5" ,"---","---" ;6
Data.s "C3" ,"---","---","---" ;7
Data.s "---","C6" ,"---","---" ;8
Data.s "---","---","---","---" ;9
Data.s "---","G6" ,"---","---" ;0
Data.s "C4" ,"---","---","---" ;1
Data.s "---","E6" ,"---","---" ;2
Data.s "---","---","---","---" ;3
Data.s "---","---","---","---" ;4
Data.s "C3" ,"C6" ,"---","---" ;5
Data.s "---","---","---","---" ;6
Data.s "---","G6" ,"---","---" ;7
Data.s "---","---","---","---" ;8
Data.s "C4" ,"E6" ,"---","---" ;9
Data.s "---","---","---","---" ;0
Data.s "---","---","---","---" ;1
Data.s "---","---","---","---" ;2
Data.s "B2" ,"B4" ,"---","---" ;3
Data.s "---","---","---","---" ;4
Data.s "---","B5" ,"---","---" ;5
Data.s "---","---","---","---" ;6
Data.s "B3" ,"F#5","---","---" ;7
Data.s "---","---","---","---" ;8
Data.s "---","D#5","---","---" ;9
Data.s "---","---","---","---" ;0
Data.s "B3" ,"---","---","---" ;1
Data.s "---","B5" ,"---","---" ;2
Data.s "---","---","---","---" ;3
Data.s "---","F#5","---","---" ;4
Data.s "B3" ,"---","---","---" ;5
Data.s "---","D#5","---","---" ;6
Data.s "---","---","---","---" ;7
Data.s "---","---","---","---" ;8
Data.s "F#3","D#5","---","---" ;9
Data.s "---","E5" ,"---","---" ;0
Data.s "---","F5" ,"---","---" ;1
Data.s "---","F5" ,"---","---" ;2
Data.s "G#3","F#5","---","---" ;3
Data.s "---","---","---","---" ;4
Data.s "---","G5" ,"---","---" ;5
Data.s "---","G5" ,"---","---" ;6
Data.s "A#3","G#5","---","---" ;7
Data.s "---","---","---","---" ;8
Data.s "---","A5" ,"---","---" ;9
Data.s "---","A5" ,"---","---" ;0
Data.s "B3" ,"A#5","---","---" ;1
Data.s "---","B2" ,"---","---" ;2
Data.s "---","---","---","---" ;3
Data.s "---","---","---","---" ;4
Data.s "END"
EndDataSection