very dirty example... and i didnt see how to attach files into this forum. need to attach opn.dll and instrument file for loading.
Code: Select all
Enumeration
#Window
#Canvas
#CanvasBackImg
#RawFileID
EndEnumeration
; structure and fill array with coordinates for fill area
Structure prsntstr
x.u
y.u
t.a
EndStructure
Global Dim PressedNotes.prsntstr(5) ;{
PressedNotes(1)\x = 5
PressedNotes(1)\y = 75
PressedNotes(2)\x = 17
PressedNotes(2)\y = 5
PressedNotes(3)\x = 25
PressedNotes(3)\y = 75
PressedNotes(4)\x = 37
PressedNotes(4)\y = 5
PressedNotes(5)\x = 45
PressedNotes(5)\y = 75
;}
; paint green marks over keys
Procedure CanvasUpdate()
SetGadgetAttribute(#Canvas, #PB_Canvas_Image, ImageID(#CanvasBackImg))
If StartDrawing(CanvasOutput(#Canvas))
For i = 1 To 5
If PressedNotes(i)\t
FillArea(PressedNotes(i)\x, PressedNotes(i)\y, RGB(1, 1, 1), RGB(0, 200, 0))
EndIf
Next
StopDrawing()
EndIf
EndProcedure
; paint base image for canvas
If CreateImage(#CanvasBackImg, 580, 140, 32, RGB(255, 255, 255)) ;{
If StartDrawing(ImageOutput(#CanvasBackImg))
Line(0, 90, 580, 1, RGB(1, 1, 1))
Line(0, 90, 580, 1, RGB(1, 1, 1))
Box(15, 0, 10, 60, RGB(1, 1, 1))
Box(16, 0, 8, 59, RGB(0, 0, 0))
Line(20, 60, 1, 30, RGB(1, 1, 1))
Box(35, 0, 10, 60, RGB(1, 1, 1))
Box(36, 0, 8, 59, RGB(0, 0, 0))
Line(40, 60, 1, 30, RGB(1, 1, 1))
Line(60, 0, 1, 90, RGB(1, 1, 1))
StopDrawing()
EndIf
;}
EndIf
;{ opn dll import
If OpenLibrary(OPNhdll, "OPN_DLL.dll")
Prototype.l OpenDriver(chip.a)
Prototype CloseDriver()
Prototype OPNWrite(chip.a, register.u, value.u)
Global OpenOPNDriver.OpenDriver = GetFunction(OPNhdll, "OpenOPNDriver")
Global CloseOPNDriver.CloseDriver = GetFunction(OPNhdll, "CloseOPNDriver")
Global OPN_Write.OPNWrite = GetFunction(OPNhdll, "OPN_Write")
Else
Debug "opn dll not found"
EndIf
;}
; procedure for setting instrument into some channel
;{ bits operations
Macro SetBit(Var, Bit) ;
Var | (Bit)
EndMacro
Macro ClearBit(Var, Bit) ;
Var & (~(Bit))
EndMacro
Macro TestBit(Var, Bit) ;
Bool(Var & (Bit))
EndMacro
Macro NumToBit(Num) ;
(1<<(Num))
EndMacro
Macro GetBits(Var, StartPos, EndPos)
((Var>>(StartPos))&(NumToBit((EndPos)-(StartPos)+1)-1))
EndMacro
;}
Global Dim Raw.l(39)
Procedure SetRegisterFromRaw(file$, vgmchannelforcode.i)
Select vgmchannelforcode
Case 0
gcshift = 0
Case 1
gcshift = 1
Case 2
gcshift = 2
Case 3
gcshift = 256
Case 4
gcshift = 257
Case 5
gcshift = 258
EndSelect
If ReadFile(#RawFileID, file$) ; if the file could be read, we continue...
While Eof(#RawFileID) = 0 ; loop as long the 'end of file' isn't reached
Number.a = ReadByte(#RawFileID)
Select Loc(#RawFileID)
Case 1 ; |??????tt| - type
If Number <> 0
MessageRequester("Attention | Внимание", "This file is unknown type of instrument.")
Break
Else
Raw(1) = Number
EndIf
Case 2 ; |????ovvv| - LFO on, LFO value
Raw(2) = Number
OPN_Write(0, $22, Number) ; global thing
Case 3 ; |mm??????| - Channel 3 mode
Raw(3) = Number
OPN_Write(0, $27, Number) ; global thing too
Case 4 ; |??fffaaa| - Feedback, Algorithm
Raw(4) = Number
OPN_Write(0, $B0+gcshift, Number)
Case 5 ; |lraa?fff| - Left/Right, AMS, FMS
Raw(5) = Number
OPN_Write(0, $B4+gcshift, Number)
Case 6 ; |?dddmmmm| - Detune, Multiply
Raw(6) = Number
OPN_Write(0, $30+gcshift, Number)
Case 7 ; |?ttttttt| - TLevel
Raw(7) = Number
OPN_Write(0, $40+gcshift, Number)
Case 8 ; |rr?aaaaa| - Rate Scale, Attack
Raw(8) = Number
OPN_Write(0, $50+gcshift, Number)
Case 9 ; |a??ddddd| - AM, Decay
Raw(9) = Number
OPN_Write(0, $60+gcshift, Number)
Case 10 ; |???sssss| - Sustain
Raw(10) = Number
OPN_Write(0, $70+gcshift, Number)
Case 11 ; |ssssrrrr| - Sustain Level, Release
Raw(11) = Number
OPN_Write(0, $80+gcshift, Number)
Case 12 ; |?dddmmmm| - Detune, Multiply
Raw(12) = Number
OPN_Write(0, $34+gcshift, Number)
Case 13 ; |?ttttttt| - TLevel
Raw(13) = Number
OPN_Write(0, $44+gcshift, Number)
Case 14 ; |rr?aaaaa| - Rate Scale, Attack
Raw(14) = Number
OPN_Write(0, $54+gcshift, Number)
Case 15 ; |a??ddddd| - AM, Decay
Raw(15) = Number
OPN_Write(0, $64+gcshift, Number)
Case 16 ; |???sssss| - Sustain
Raw(16) = Number
OPN_Write(0, $74+gcshift, Number)
Case 17 ; |ssssrrrr| - Sustain Level, Release
Raw(17) = Number
OPN_Write(0, $84+gcshift, Number)
Case 18 ; |?dddmmmm| - Detune, Multiply
Raw(18) = Number
OPN_Write(0, $38+gcshift, Number)
Case 19 ; |?ttttttt| - TLevel
Raw(19) = Number
OPN_Write(0, $48+gcshift, Number)
Case 20 ; |rr?aaaaa| - Rate Scale, Attack
Raw(20) = Number
OPN_Write(0, $58+gcshift, Number)
Case 21 ; |a??ddddd| - AM, Decay
Raw(21) = Number
OPN_Write(0, $68+gcshift, Number)
Case 22 ; |???sssss| - Sustain
Raw(22) = Number
OPN_Write(0, $78+gcshift, Number)
Case 23 ; |ssssrrrr| - Sustain Level, Release
Raw(23) = Number
OPN_Write(0, $88+gcshift, Number)
Case 24 ; |?dddmmmm| - Detune, Multiply
Raw(24) = Number
OPN_Write(0, $3C+gcshift, Number)
Case 25 ; |?ttttttt| - TLevel
Raw(25) = Number
OPN_Write(0, $4C+gcshift, Number)
Case 26 ; |rr?aaaaa| - Rate Scale, Attack
Raw(26) = Number
OPN_Write(0, $5C+gcshift, Number)
Case 27 ; |a??ddddd| - AM, Decay
Raw(27) = Number
OPN_Write(0, $6C+gcshift, Number)
Case 28 ; |???sssss| - Sustain
Raw(28) = Number
OPN_Write(0, $7C+gcshift, Number)
Case 29 ; |ssssrrrr| - Sustain Level, Release
Raw(29) = Number
OPN_Write(0, $8C+gcshift, Number)
Case 30
Raw(30) = Number ;: Debug Hex(Number)
OPN_Write(0, $A6, Number)
Number = ReadByte(#RawFileID) ;: Debug Hex(Number)
OPN_Write(0, $A2, Number)
Raw(31) = Number
Case 32
Raw(32) = Number; : Debug Hex(Number)
OPN_Write(0, $AC, Number)
Number = ReadByte(#RawFileID); : Debug Hex(Number)
OPN_Write(0, $A8, Number)
Raw(33) = Number
Case 34
Raw(34) = Number; : Debug Hex(Number)
OPN_Write(0, $AD, Number)
Number = ReadByte(#RawFileID); : Debug Hex(Number)
OPN_Write(0, $A9, Number)
Raw(35) = Number
Case 36
Raw(36) = Number; : Debug Hex(Number)
OPN_Write(0, $AE, Number)
Number = ReadByte(#RawFileID); : Debug Hex(Number)
OPN_Write(0, $AA, Number)
Raw(37) = Number
;|??ffffffffffffff| - 14-bit frequency channel 3 mode operator 4 (A6, A2)
;
;|??ffffffffffffff| - 14-bit frequency channel 3 mode operator 3 (AC, A8)
;
;|??ffffffffffffff| - 14-bit frequency channel 3 mode operator 1 (AD, A9)
;
;|??ffffffffffffff| - 14-bit frequency channel 3 mode operator 2 (AE, AA)
;
Case 38 ;{ keyon param
Raw(38) = Number ;: Debug Bin(Number)
;}
EndSelect
Wend
CloseFile(#RawFileID) ; close the previously opened file
OPN_Write(0, $90+gcshift, 0)
OPN_Write(0, $94+gcshift, 0)
OPN_Write(0, $98+gcshift, 0)
OPN_Write(0, $9C+gcshift, 0)
Else
MessageRequester("Information","Couldn't open the raw file!")
EndIf
EndProcedure ;}
; starting work opn core
OpenOPNDriver(1)
If OpenWindow(#Window, 100, 100, 600, 160, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
CanvasGadget(#Canvas, 10, 10, 580, 140, #PB_Canvas_Keyboard)
SetActiveGadget(#Canvas)
CanvasUpdate()
SetRegisterFromRaw("patch_34.raw", 0)
SetRegisterFromRaw("patch_34.raw", 1)
SetRegisterFromRaw("patch_34.raw", 2)
SetRegisterFromRaw("patch_34.raw", 3)
SetRegisterFromRaw("patch_34.raw", 4)
OPN_Write(0, $A4, $1284 >> 8) ; set notes values into registers of 1 ch
OPN_Write(0, $A0, $1284 & $FF)
OPN_Write(0, $A5, $12AA >> 8) ; set notes values into registers of 2 ch
OPN_Write(0, $A1, $12AA & $FF)
OPN_Write(0, $A6, $12D3 >> 8) ; set notes values into registers of 3 ch
OPN_Write(0, $A2, $12D3 & $FF)
OPN_Write(0, $A4 + 256, $12FE >> 8) ; set notes values into registers of 4 ch
OPN_Write(0, $A0 + 256, $12FE & $FF)
OPN_Write(0, $A5 + 256, $132B >> 8) ; set notes values into registers of 5 ch
OPN_Write(0, $A1 + 256, $132B & $FF)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #Canvas
Select EventType()
Case #PB_EventType_KeyDown
Select GetGadgetAttribute(#Canvas, #PB_Canvas_Key)
Case #PB_Shortcut_Z ; do ; 1284 ; Raw(38)
PressedNotes(1)\t = 1
CanvasUpdate()
OPN_Write(0, $28, (Raw(38) << 4))
Case #PB_Shortcut_S ; 12AA
PressedNotes(2)\t = 1
CanvasUpdate()
OPN_Write(0, $28, (Raw(38) << 4) + 1)
Case #PB_Shortcut_X ; re ; 12D3
PressedNotes(3)\t = 1
CanvasUpdate()
OPN_Write(0, $28, (Raw(38) << 4) + 2)
Case #PB_Shortcut_D ; 12FE
PressedNotes(4)\t = 1
CanvasUpdate()
OPN_Write(0, $28, (Raw(38) << 4) + 4)
Case #PB_Shortcut_C ; mi ; 132B
PressedNotes(5)\t = 1
CanvasUpdate()
OPN_Write(0, $28, (Raw(38) << 4) + 5)
EndSelect
Case #PB_EventType_KeyUp
Select GetGadgetAttribute(#Canvas, #PB_Canvas_Key)
Case #PB_Shortcut_Z ; do
PressedNotes(1)\t = 0
CanvasUpdate()
OPN_Write(0, $28, 0)
Case #PB_Shortcut_S
PressedNotes(2)\t = 0
CanvasUpdate()
OPN_Write(0, $28, 1)
Case #PB_Shortcut_X ; re
PressedNotes(3)\t = 0
CanvasUpdate()
OPN_Write(0, $28, 2)
Case #PB_Shortcut_D
PressedNotes(4)\t = 0
CanvasUpdate()
OPN_Write(0, $28, 4)
Case #PB_Shortcut_C ; mi
PressedNotes(5)\t = 0
CanvasUpdate()
OPN_Write(0, $28, 5)
EndSelect
EndSelect
EndSelect
Case #PB_Event_CloseWindow
qiut = 1
EndSelect
Until qiut = 1
CloseOPNDriver()
If OPNhdll : CloseLibrary(OPNhdll) : EndIf
EndIf
End