' *********************************************************************** ' * procedure code for * ' *********************************************************************** ' This is a section in Godfried-Willem Raes street opera 'Red Nick' ' Can be performed alone, with flute & barrelorgans. ' declarations for toverfluit ' *********************************************************************** DECLARE SUB ToverInit () DECLARE SUB ToverListen () ' 16 = %Listen_Task DECLARE SUB ToverDelayPlayerVoxHumNorm () ' 26 DECLARE SUB ToverDelayPlayerVoxHumBackw () ' 27 DECLARE SUB ToverDelayPlayerF () ' 22 DECLARE SUB ToverDelayPlayerS () ' 23 DECLARE SUB ToverDelayPlayerN () ' 24 DECLARE SUB ToverDelayPlayerBackN () ' 25 SUB ToverInit 'DIM Piperola AS GLOBAL musician 'DIM Humanola AS GLOBAL musician 'GetInstrumentParams Piperola, %ID_PIPEROLA 'GetInstrumentParams Humanola, %ID_HUMANOLA Init_MM Task(%Listen_Task).naam = "Listen" Task(%Listen_Task).swit = %False Task(%Listen_Task).freq = 50 Task(%Listen_Task).channel = 0 Task(%Listen_Task).cPtr = CODEPTR(ToverListen) Task(22).naam = "FastPlay" ' demo for delayed player input - double speed Task(22).swit = %False Task(22).freq = 60 Task(22).channel = Piperola.channel ' -> piperola Task(22).level = 127 Task(22).cptr = CODEPTR(ToverDelayPlayerF) ' = GMT_DEMO procedure Task(23).naam ="SlowPlay" :' demo for delayed player input at half speed Task(23).swit = %False Task(23).freq = 16 Task(23).channel = Piperola.channel ' -> piperola Task(23).level = 127 Task(23).cptr = CODEPTR(ToverDelayPlayerS) Task(24).naam ="DelyPlay" :' demo for delayed player input at normal speed Task(24).swit = %False Task(24).freq = 32 Task(24).channel = Piperola.channel ' -> piperola Task(24).level = 127 Task(24).cptr = CODEPTR(ToverDelayPlayerN) Task(25).naam ="BackPlay" :' demo for backwards delay line at normal speed Task(25).swit = %False Task(25).freq = 31 Task(25).channel = Piperola.channel ' -> PIPEROLA Task(25).level = 127 Task(25).cptr = CODEPTR(ToverDelayPlayerBackN) Task(26).naam = "DlyHuman" Task(26).channel = Humanola.channel Task(26).freq = 20 Task(26).level =127 Task(26).cptr = CODEPTR(ToverDelayPlayerVoxHumNorm) Task(27).naam = "HumanBck" Task(27).channel = Humanola.channel Task(27).freq = 17 Task(27).level =127 Task(27).cptr = CODEPTR(ToverDelayPlayerVoxHumBackw) ButnOS(1).tag = "HumOf" ButnOS(2).tag = "PipOf" ButnOS(3).tag = "PiaOf" ButnOS(1).cptr = CODEPTR(MM_Humanola_Off) 'ButnOS_HumanolaOFF) ButnOS(2).cptr = CODEPTR(MM_Piperola_Off) 'ButnOS_PiperolaOFF) ButnOS(3).cptr = CODEPTR(MM_Piano_Off) 'ButnOS_PlayerPianoOFF) END SUB SUB ToverListen () EXPORT LOCAL nv%, noot?, velo? nv% = GetMidiNote% (Flute.channel, %Remove OR %Oldest) IF nv% = %NotFalse THEN EXIT SUB ' if no note came in, exit the task velo? = LOBYT (nv%) noot? = HIBYT (nv%) ' write it into the delayline: WriteDelayLine noot?, velo? END SUB SUB ToverDelayPlayerF () EXPORT ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This task plays at twice original speed. LOCAL nv%, noot?, velo?, tasknr% tasknr% = 22 nv% = ReadDelayLine%(tasknr%, 10000, 1.5!) ' instance 1 of a delaylinereader ' 10 second delay = 10000 milliseconds ' > 1 speed-up ' < 1 slow down - debugged o.k. SELECT CASE nv% CASE %False, %NotFalse: EXIT SUB ' if no note came in, exit the task CASE -2 ' read past present. ' This can only happen if speed! > 1! Task(tasknr%).Har.vel = STRING$(128,0) PlayHar Task(tasknr%).Har, Task(tasknr%).channel nv% = ReadDelayLine%(tasknr%, 0, 0) :' force a reset 'Task(tasknr%).swit = %False :' this if we want auto switch off EXIT SUB END SELECT velo? = LOBYT (nv%) noot? = HIBYT (nv%) ' lets implement full polyphonic playing: IF noot? >= Piperola.lowtes THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har, noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB SUB ToverDelayPlayerS ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This code plays back at half speed, so it never ends. LOCAL nv%, noot?, velo?, tasknr% tasknr%= 23 nv% = ReadDelayLine%(tasknr%, 250, 0.5!) ' instance 3 of a delaylinereader ' 0.25 second delay ' < 1 slow down - debugged o.k. IF nv% <= %False THEN EXIT SUB velo? = LOBYT (nv%) noot? = HIBYT (nv%) IF noot? >= Piperola.lowtes THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har,noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har,noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB SUB ToverDelayPlayerN () ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This one outputs at normal speed. LOCAL nv%, noot?, velo? , tasknr% tasknr% = 24 nv% = ReadDelayLine%(tasknr%, 3000, 1!) ' instance 2 of a delaylinereader ' 3 second delay ' > 1 speed-up ' < 1 slow down SELECT CASE nv% CASE %False: EXIT SUB CASE %NotFalse : EXIT SUB :' if no note came in, exit the task CASE -2 ' read past present. ' This can only happen if speed! > 1! nv% = ReadDelayLine%(tasknr%, 0, 0) :' force a reset 'Task(tasknr%).swit = %False EXIT SUB END SELECT velo? = LOBYT (nv%) noot? = HIBYT (nv%) ' lets implement full polyphonic playing: IF noot? >= Piperola.lowtes THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har, noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB SUB ToverDelayPlayerBackN () ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This code plays back backwards. LOCAL nv%, noot?, velo? , tasknr% tasknr%= 25 nv% = ReadDelayLine%(tasknr%, 6000, -1!) ' instance 4 of a delaylinereader ' 6 second delay ' > 1 speed-up ' < 1 slow down ' negative = backwards playing SELECT CASE nv% CASE %False,%NotFalse, -2: EXIT SUB CASE -3 ' read past delay in backwardsmode ' we can force a reset: nv% = ReadDelayLine%(tasknr%,0,0) Task(tasknr%).Har.vel= STRING$(128,0) PlayHar Task(tasknr%).Har, Task(tasknr%).channel ' we could of course also switch the task off... 'Task(tasknr%).swit = %False END SELECT velo? = LOBYT (nv%) noot? = HIBYT (nv%) IF noot? >=Piperola.lowtes THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har, noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB SUB ToverDelayPlayerVoxHumBackw ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This code plays back backwards. LOCAL nv%, noot?, velo? STATIC tasknr% STATIC oldnoot?, oldvelo? IF ISFALSE tasknr% THEN tasknr% = 27 nv% = ReadDelayLine%(tasknr%, 7000, -0.6!) ' instance 6 of a delaylinereader ' 7 second delay ' > 1 speed-up ' < 1 slow down ' negative = backwards playing SELECT CASE nv% CASE %False,%NotFalse, -2 EXIT SUB CASE -3 ' read past delay in backwardsmode ' we can force a reset: nv% = ReadDelayLine%(tasknr%,0,0) Task(tasknr%).Har.vel= STRING$(128,0) PlayHar Task(tasknr%).Har, Task(tasknr%).channel ' we could of course also switch the task off... 'Task(tasknr%).swit = %False 'Menuscreen tasknr% END SELECT velo? = nv% AND &H007F SHIFT RIGHT nv%, 8 noot? = nv% AND &H007F IF (noot? >= Humanola.lowtes) AND (noot? <=Humanola.hightes) THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har, noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB SUB ToverDelayPlayerVoxHumNorm ' this taskprocedure demonstrates how to build a delay-line for ' midi input. This one outputs at normal speed. LOCAL nv%, noot?, velo? STATIC tasknr% IF ISFALSE Tasknr% THEN tasknr% = 26 nv% = ReadDelayLine%(tasknr%, 4000, 1!) ' instance 5 of a delaylinereader ' 4 second delay = 400 milliseconds ' > 1 speed-up ' < 1 slow down SELECT CASE nv% CASE %False EXIT SUB CASE %NotFalse EXIT SUB ' if no note came in, exit the task CASE -2 ' read past present. ' This can only happen if speed! > 1! nv% = ReadDelayLine%(tasknr%, 0, 0) :' force a reset EXIT SUB END SELECT velo? = nv% AND &H007F SHIFT RIGHT nv%, 8 noot? = nv% AND &H007F ' lets implement full polyphonic playing: IF (noot? >= Humanola.lowtes) AND (noot? <=Humanola.hightes) THEN IF velo? = %False THEN DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel ELSE DelNote2Har Task(tasknr%).Har, noot? PlayHar Task(tasknr%).Har, Task(tasknr%).channel AddNote2Har Task(tasknr%).Har, noot?, velo? PlayHar Task(tasknr%).Har , Task(tasknr%).channel END IF END IF END SUB