' ******************************************* ' * TECHNOFAUSTUS * ' * a chamber opera for man and machines by * ' * Godfried-Willem Raes * ' * TEKNE * ' * Mefisto's Dance * ' ******************************************* ' Robots used in this act: ' Qt/Piperola/Boudonola, Vox Humanola/Krum, Harma/HarmO ' Troms, Vibi, Belly , Xy, Klung, Springers, Autosax, Thunderwood, Tubi, Casta, Piano ' INTERACTION: Sonar OR Radar ' 21.07.2002: eerste versie afgewerkt en uitgetest met technodans. ' 22.07.2002: Avant-premiere M&M ensemble. Beweging: gwr. ' 23.07.2002: Harmony changed. Stopcode added. ' Second performance by gwr ' 24.07.2002: Third performance by gwr - faster is physically impossible for me... ' 12.08.2002: Fourth performance, with new thunderwood elements. ' 28.11.2002: Fifth performance: Enschede. ' 15.12.2002: springers added in ending. ' 19.12.2002: performance at logos - with all available robots. ' to be changed: too much windmachine from thunderwood!!! ' april 2003: Seventh performance: HAM-concert at Logos. ' 29.05.2003: Piperola and Humanola motor commands added. ' 22.04.2003: code changes 15.04.2003 got lost somewhere... did'nt we have scoring? ' 23.07.2003: Eight performance ' 24.07.2003: Ninth performance ' 18.09.2003: code for radar implementation added. To be tested. ' 19.09.2003: Cockpit sliders used now for sensitivity settings on Radar/ Sonar ' 20.09.2003: controls moved to g_main.inc for general radar use. ' Radar-ii implemented. Cockpit sliders are free for other uses now. ' 21.09.2003: rehearsals with radar input. Parameter setting. ' 23.09.2003: integration added for @qr.vf(4) in g_nih.dll ' 24.09.2003: further work on radar mapping of movement speed. ' 25.09.2003: test new exponential rescale function. ' 04.10.2003: performance in The Hague. Duration shortened with 60 seconds. ' 15.12.2004: embargo M.Darge against Emilie... Technofaustus opus halted. ' 08.01.2005: upgraded for Bourdonola. ' 13.09.2006: tried out again with sonar interface. ' adapted to new M&M hardware. ' 02.12.2006: rehearsal for performance ' 14.05.2006: casta part changed: Casta1 en 2 implemented. ' start adding Xy part ' Code revision for M&M concert 15.05.2007: "Dances" - 12th performance. - using sonar. ' 01.09.2007: Rotomoton added again. ' 31.05.2014: Reconsidered for performance in the M&M june concert. ' needs to be adapted for doppler ii-2010 coding using gesture recognition. ' Instrumentation needs an upgrade. ' Coding for ii_2000 hardware and Nidaqmx started. (using the DopplerType) ' In principle this works o.k., but we have to rescale the speed-scalings a bit downwards. ' Krum added, doubling Vox Humanola ' TO DO: find alternative for rotomoton. ? Snar/Simba ' 01.06.2014: Rotomoton doubled with Temblo, low blocks. ' 12.06.2014: Rehearsal session with Emilie De Vlam ' 18.06.2014: Performance with Emilie De Vlam %Faust_Tekne1 = 18 %Faust_Tekne_Harm = %Faust_Tekne1 + 1 ' no longer used as task %Faust_Tekne_Meta = %Faust_Tekne1 + 3 ' scoring %Faust_Tekne_Spek = %Faust_Tekne1 + 4 ' not used as task %Faust_Tekne_Bird = %Faust_Tekne1 + 5 %Faust_Tekne_Tubi = %Faust_Tekne1 + 6 ' tail - added 24.07.2003 DECLARE FUNCTION Init_Tekne () AS DWORD DECLARE SUB Tekne_ButnSW_StartStop () DECLARE SUB Faust_Tekne1 () ' task DECLARE SUB Faust_Tekne_Stop () 'DECLARE SUB Faust_Tekne_Harm () ' not used as task. DECLARE SUB Faust_Tekne_Meta () ' task DECLARE SUB Faust_GetSpectralChord () ' used as task and by direct call 'DECLARE SUB Faust_Tekne_Meta () ' task DECLARE SUB Faust_Tekne_Bird () ' task DECLARE SUB Tekne_fcurve_Slider () ' slider 0 callback, only for Radar research FUNCTION Init_Tekne () AS DWORD LOCAL m AS ASCIIZ * 35 LOCAL i AS LONG App.id = %ID_TEKNE ' basistempo bij aanvang - ' changed 24.07.2003 to be consistent with ini setting in Tekne_Meta: ' shortened for performance in The Hague. (04.10.2003] App.tempo = 120 'App.komposduur = 375 ' = 6'15" '390 ' = 6'30" + 15" ending 420 ' = 7 minutes + 15 seconds for the ending. App.Komposduur = Read_Duration_From_File ($faustini, "Tekne") ' new function in g_file.dll 15.10.2003 Tekne.duur = 375 ' 390 '420 ButnSW(1).tag0 = "Start" ' start/stop toggle SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 1, ButnSW(1).tag0 ButnSW(1).flag = %False ' reset ButnSW(1).cptr = CODEPTR(Tekne_ButnSW_StartStop) ' start / stop the running act ' delete previously existing tasks...: FOR i = 16 TO 48 RemoveCockpitTask i NEXT i Task(%Faust_Tekne1).naam = "Tekne" Task(%Faust_Tekne1).cPtr = CODEPTR(Faust_Tekne1) Task(%Faust_Tekne1).freq = 10 Task(%Faust_Tekne1).flags = %False '%Harm_Task ' for debug only Task(%Faust_Tekne1).duur = Tekne.duur TaskEX(%Faust_Tekne1).stopCptr = CODEPTR(Faust_Tekne_Stop) Task(%Faust_Tekne_Meta).naam = "Meta" Task(%Faust_Tekne_Meta).cptr = CODEPTR(Faust_Tekne_Meta) Task(%Faust_Tekne_Meta).freq = 1 Task(%Faust_Tekne_Spek).naam = "H_Spek" Task(%Faust_Tekne_Spek).cPtr = CODEPTR(Faust_GetSpectralChord) Task(%Faust_Tekne_Spek).freq = 0.1 Task(%Faust_Tekne_Spek).flags = %False '%Hidden_Task '%HARM_TASK 'OR %HIDDEN_TASK Task(%Faust_Tekne_Bird).naam = "Bird" Task(%Faust_Tekne_Bird).cptr = CODEPTR(Faust_Tekne_Bird) Task(%Faust_Tekne_Bird).freq = 20 Task(%Faust_Tekne_Bird).flags = %False TaskEX(%Faust_Tekne_Bird).startcptr = CODEPTR(MM_ThunderWood_On) Task(%Faust_Tekne_Tubi).naam = "Tubi" Task(%Faust_Tekne_Tubi).cptr = CODEPTR(Faust_Tekne_Tubi) Task(%Faust_Tekne_Tubi).freq = 4 Task(%Faust_Tekne_Tubi).flags = %False TaskEX(%Faust_Tekne_Tubi).startcptr = CODEPTR(MM_Tubi_On) FaustPatches "tekne" ' proc. in faust.inc - initialises M&M robots, No patches. IF Sonar_Radar = 1 THEN ' only for the radar version. ' use slider 0 for setting of mapping curve: Slider(0).tag = "fcurve" SetDlgItemText gh.Cockpit, %GMT_TEXT_SLIDER0, Slider(0).tag Slider(0).value = 100 ' was 64,center, to the right will expand curve, to the left will contract ' test 25.09.2003: 100 is a good position. SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value Slider(0).cptr = CODEPTR(Tekne_fcurve_slider) f_ex = (100-64)/32 '= 1.125 ' exponent for rescaling of @pr().vf ' was 1! ' global! f_fakt = Scalingfactor_Exp (64,f_ex) ' = 0.5946 END IF m = "" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr SetDlgItemText gh.Cockpit, %GMT_MSG1, "Mefisto's dance" SetDlgItemText gh.Cockpit, %GMT_MSG2, "for invisible instrument and robots" FUNCTION = %True END FUNCTION SUB Tekne_ButnSW_StartStop () LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL cptr AS DWORD ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID IF ButnSW(Buttonnr).flag THEN SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "STOP" App.MTstart = %True App.tstart = timegettime StartTask %Faust_Tekne_Meta StartTask %Faust_Tekne1 Promil %True Runtime %True SELECT CASE Sonar_Radar CASE 0'%False ' 8/16 channel I/O sonar cptr = GetProcAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%DAQ_DOUBLEBUFFER) 'Sonar_DAQ %DAQ_DOUBLEBUFFER CASE 1'%TRue ' radar cptr = GetProcAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%DAQ_DOUBLEBUFFER) 'Radar_DAQ %DAQ_DOUBLEBUFFER CASE 2 ' doppler ii_2010 ' seems to work without anything here... 31.05.2014 ' this is the code pasted in from namuda.inc (01.06.2014) cptr = GetProcAddress(gh.gnh, "DOPPLER_DAQ") CALL DWORD cptr USING Doppler_DAQ(%DAQ_DOUBLEBUFFER) SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(8),4) '+ "S/s" 'SLEEP 10 ShowWindow Task(%DopplerTetraControl).hParam, %SW_SHOW 'SLEEP 10 ' MSGBOX "pre display..",,FUNCNAME$ IF ISFALSE Task(%DopplerTetraDisplay).swit THEN Starttask %DopplerTetraDisplay 'see what happens if we omit this.. 'SLEEP 20 END SELECT ELSE FOR i = 16 TO 47 IF Task(i).swit THEN StopTask i NEXT i SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + ButtonNr, "CONT" SELECT CASE Sonar_Radar CASE 0'%False cptr = GetProcAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%false) 'Sonar_DAQ %False CASE 1'%True cptr = GetProcAddress(gh.gnh, "RADAR_DAQ") CALL DWORD cptr USING Radar_DAQ(%false) 'Radar_DAQ %False CASE 2 ' seems to work without anything here... 31.05.2014 ' this should switch off the DAQ function (pasted from Namuda.inc, 01.06.2014) 'STATIC cptr AS DWORD IF ISFALSE DAQparams.daqstopped THEN cptr = GetProcAddress(gh.gnh, "DOPPLER_DAQ") CALL DWORD cptr USING Doppler_DAQ(%False) END IF SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(%False) '+ "S/s" Showwindow Task(%DopplerTetraControl).hParam, %SW_HIDE IF Task(%DopplerTetraDisplay).swit THEN stoptask %DopplerTetraDisplay END SELECT MM_AllOff END IF App.butnSWparam = %False END SUB SUB Faust_Tekne_Stop () IF Task(%Faust_Tekne_Meta).swit THEN StopTask %Faust_Tekne_Meta IF Task(%Faust_Tekne_Harm).swit THEN StopTask %Faust_Tekne_Harm Promil %False InstrumallNotesOff AutoSax InstrumallNotesOff ThunderWood InstrumallNotesOff Piano MM_Bourdonola_Off %MM_Motor OR %MM_Notes MM_Piperola_Off %MM_Motor OR %MM_Notes MM_Humanola_Off %MM_Motor OR %MM_Notes MM_Klung_Off ' MM_Rotomoton_Off MM_Belly_Off MM_Harma_Off %MM_Motor OR %MM_Notes MM_Qt_Off %MM_Motor OR %MM_Notes MM_Rotomoton_Off MM_Krum_Off ' added 31.05.2014 MM_Temblo_Off MM_So_Off END SUB SUB Faust_Tekne1 () ' to be done: - improve harmony flow ' - userinterface for individual instrument switching LOCAL i AS DWORD ' pattern byte 32 bits AS QUAD for 64 bits binary pattern LOCAL noot AS INTEGER LOCAL sig AS SINGLE LOCAL beatcounter AS DWORD STATIC tf AS SINGLE ' changed 22.09.2003 from local to static STATIC cnt AS DWORD ' 4 byte pattern counter LOCAL cacnt AS DWORD ' castanet counter 14.05.2007 LOCAL oi AS DWORD STATIC j AS BYTE ' rotators - troms STATIC k AS BYTE ' kastagnetten - casta 1 & 2 STATIC l AS BYTE ' klung STATIC n AS BYTE ' thunderwood STATIC p AS BYTE ' belly STATIC r AS BYTE ' springers STATIC t AS BYTE ' piperola - qt STATIC v AS BYTE ' bourdonola - qt STATIC x AS BYTE ' piano STATIC z AS BYTE ' humanola STATIC s AS BYTE ' sax STATIC q AS BYTE ' harma STATIC m AS BYTE ' vibi STATIC h AS BYTE ' rotomoton - temblo STATIC y AS BYTE ' xy STATIC oldbellynoot AS INTEGER STATIC oldklungnoot AS INTEGER STATIC oldpipnoot AS INTEGER STATIC oldbournoot AS INTEGER STATIC oldpianoot AS INTEGER STATIC oldhumnoot AS INTEGER STATIC oldsaxnoot AS INTEGER STATIC oldharmanoot AS INTEGER STATIC oldvibinoot AS INTEGER STATIC oldxynoot AS INTEGER IF ISFALSE Task(%Faust_Tekne1).tog THEN 'App.tempo = 166 ' conform init. ' removed 24.07.2003 - initial tempo is set in Tekne_Meta !!! ' Now we will have a much better accelerando. Tekne.ThunderWood_Tog = %True Tekne.Harma_Tog = %True Tekne.Springers_Tog = %True ' %False for july 2002 version only Tekne.Rotomoton_Tog = %True '%False ' %True ' %False for july 2002 and 2003 version only Tekne.speedprop = 508 ' = 4 x 127 for Sonar MM_So_On StartTask %Faust_Tekne_Spek ' start harmony generator MM_Autosax_On 'Modemess AutoSax.channel, 16, 0 '127 ' set mike mixer level off. 'Modemess AutoSax.channel, 7, 100 ' midi volume Progchange Harma.channel, 15 Modemess Harma.channel,7,127 ' wind max. ProgChange Piano.channel, %False MM_Belly_On MM_Vitello_ON ' following is a problem now... 'ModeMess Belly.channel, &H44, %True ' set to intelligent listen task (pitch mapping) 'ModeMess Belly.channel, 4, 20 ' default instelling. ' changed in procedure itself 15.09.2006 MM_Bourdonola_On MM_Klung_On MM_Tubi_On MM_ThunderWood_On MM_Vibi_On MM_Piperola_ON MM_Humanola_ON MM_Qt_On MM_Xy_On MM_Rotomoton_On MM_Temblo_On MM_Krum_On ' added 31.05.2014 Task(%Faust_Tekne1).tog = %True EXIT SUB END IF ' following levels become functions of invisible instrument inputs. SELECT CASE Sonar_Radar CASE 0'%False ' Sonar invisible instrument ' new: 20.09.2003: [tested 21.09.2003: o.k.] ' changed 02.11.2003!!! Tekne.Troms_Level = @sr.sx 'xys ' integrated surface as seen from xy Tekne.Springers_Level = @sr.sy 'xzs ' = rotolevel Tekne.Klung_level = @sr.sx 'yxs 'AvgStatArr (DataBuf2(),sig,DAQparams.scanfreq) ' = saxlevel Tekne.ThunderWood_Level = @sr.sy 'yzs 'AvgStatArr (DataBuf3(),sig,DAQparams.scanfreq) Tekne.Sax_Level = @sr.sz 'zxs 'Tekne.Klung_level Tekne.Rotomoton_Level = @sr.sy 'zys 'Tekne.Springers_Level Tekne.Belly_Level = @sr.xf Tekne.Piano_Level = @sr.yf Tekne.Harma_Level = @sr.zf Tekne.Xy_level = @sr.zf Tekne.Vibi_Level = @sr.xyzf SHIFT RIGHT Tekne.Troms_Level,5 SHIFT RIGHT Tekne.Springers_Level,5 SHIFT RIGHT Tekne.Klung_level,5 SHIFT RIGHT Tekne.ThunderWood_Level,5 SHIFT RIGHT Tekne.Belly_Level,5 SHIFT RIGHT Tekne.Piano_Level,5 SHIFT RIGHT Tekne.Harma_Level,5 SHIFT RIGHT Tekne.Vibi_Level,5 SHIFT RIGHT Tekne.Sax_Level, 5 SHIFT RIGHT Tekne.Rotomoton_Level, 5 SHIFT RIGHT Tekne.Xy_level, 5 tf = Tekne.Piano_Level + Tekne.Belly_Level + Tekne.Harma_Level + Tekne.Vibi_Level ' 0-512 ' we modulate tempo with velocity of movement: tf = 1 + (tf/Tekne.speedprop) ' tf = 1 to 2.8 - speedprop set to 508 on init ' speedprop is modulated in the scoring. Task(%Faust_Tekne1).freq = App.tempo * tf / 60 ' 4 - 14 Hz i.p.v. 4-8 Hz CASE 1'%True ' quadrada settings - Radar invisible instrument ' The mapping of movement speed on tempo is not so good as with sonar!!! ' maybe noise level should be increased. Tekne.Troms_Level = MIN(@pr(0).s, 127) Tekne.Springers_Level = MIN(@pr(1).s,127) ' = rotolevel Tekne.Klung_level = MIN(@pr(2).s,127) ' = saxlevel Tekne.ThunderWood_Level = MIN(@pr(3).s, 127) Tekne.Belly_Level = MIN(@pr(0).vf * 2, 127) Tekne.Piano_Level = MIN(@pr(1).vf * 3, 127) Tekne.Harma_Level = MIN(@pr(2).vf * 4, 127) Tekne.Vibi_Level = MIN(@pr(3).vf * 2, 127)'xyzf Tekne.Sax_Level = Tekne.Klung_level Tekne.Rotomoton_Level = Tekne.Springers_Level Tekne.Xy_level = Tekne.Harma_Level ' te testen. ' here we better use an exponential curve: small values should be smaller, large values larger.: ' try this: [ tested O.K. 25.09.2003, with f_ex = 1,125 and f_Fakt = 0.5946 ] tf = MAX(@pr(4).vf,@pr(4).v * 3.74) ' v rescaled to get same range as vf IF f_ex <> 1 THEN tf = (tf ^ f_ex) * f_Fakt END IF ' we should check the maximum value received for @pr(4) and then multiply it with a factor ' such that we get 0-508: tf = tf * 16 'tf = @pr(4).vf * 16 '7.05 '( 7.05 is when we assume @pr(4).vf <= 72) ' in theory, vf is in Hz and cannot be larger than 64Hz as we sample ' at 128S/s... (the factor would be 7.937 , say 8, in that case) ' to be compatible with sonar, speedprop should be rescaled to ' 4x 64 = 256, which is the same as stating here ' tf = @pr(4).vf * 16 ' we modulate tempo with velocity of movement: tf = 0.66 + (tf/Tekne.speedprop) ' tf = 0.5 to 2.3 - speedprop set to 508 on init ' speedprop is modulated in the scoring. ' The radar equipment reacts differently to speed: when a lot of body is moving, ' the zero-cross algorithm detects mostly the speed of the large body parts. ' This leads to odd behaviour in that vigourous movement can lead to slower ' detected speeds. 'Task(%Faust_Tekne1).freq = App.tempo * tf / 60 ' 4 - 14 Hz i.p.v. 4-8 Hz ' we could integrate this directly: Task(%Faust_Tekne1).freq = ((Task(%Faust_Tekne1).freq * 7) + (App.tempo * tf /60) ) /8 CASE 2 ' using ii_2000 hardware. ' coding added 31.05.2014 ' to be checked for compatibility with earlier coding. (scaling to be checked) Tekne.Troms_Level = @pDoppler.xa * 127 '@sr.sx 'xys Tekne.Springers_Level = @pDoppler.ya * 127 '@sr.sy 'xzs Tekne.Klung_level = @pDoppler.za * 127 '@sr.sx 'yxs Tekne.ThunderWood_Level = @pDoppler.ya * 127 '@sr.sy 'yzs Tekne.Sax_Level = @pDoppler.za * 127 '@sr.sz 'zxs Tekne.Rotomoton_Level = @pDoppler.ya * 127 'sr.sy 'zys Tekne.Belly_Level = MIN(127, @pDoppler.xf) '@sr.xf Tekne.Piano_Level = MIN(127,@pDoppler.yf) '@sr.yf Tekne.Harma_Level = MIN(127,@pDoppler.zf) '@sr.zf Tekne.Xy_level = MIN(127,@pDoppler.zf) '@sr.zf Tekne.Vibi_Level = MIN(127, MAX(@pDoppler.xf, @pDoppler.yf, @pDoppler.zf)) '@sr.xyzf ' for debug and scaling research we could use the mDisplay here... 'IF Tekne.Vibi_Level \ 1000 THEN mPlay mDisplay.channel, 1, (Tekne.Vibi_Level \ 1000) MOD 10 'IF Tekne.Vibi_Level \ 100 THEN ' mPlay mDisplay.channel, 2, (Tekne.Vibi_Level \ 100) MOD 10 'IF Tekne.Vibi_Level \ 10 THEN ' mPlay mDisplay.channel, 3, (Tekne.Vibi_Level \ 10) MOD 10 ' mPlay mDisplay.channel, 4, Tekne.Vibi_Level MOD 10 ' end display debug tool tf = Tekne.Piano_Level + Tekne.Belly_Level + Tekne.Harma_Level + Tekne.Vibi_Level ' 0-512 ' we modulate tempo with velocity of movement: tf = 1 + (tf/Tekne.speedprop) ' tf = 1 to 2.8 - speedprop set to 508 on init ' speedprop is modulated in the scoring. Task(%Faust_Tekne1).freq = App.tempo * tf / 60 ' 4 - 14 Hz i.p.v. 4-8 Hz END SELECT ' here starts the playing algorithm: ' TROMS: IF Tekne.Troms_Level THEN i = cnt AND &H07F IF j THEN ROTATE LEFT i,j IF BIT (i,0) THEN mPlay Troms.Channel, 24 + (j MOD 6), Tekne.Troms_Level :INCR beatcounter 'bastrom IF BIT (i,1) THEN mPlay Troms.Channel, 30 + (j MOD 4) , Tekne.Troms_Level : INCR beatcounter 'tenor IF BIT (i,2) THEN mPlay Troms.Channel, 34 + (j MOD 4), Tekne.Troms_Level : INCR beatcounter 'altotrom IF BIT (i,3) THEN mPlay Troms.Channel, 38 + (j MOD 3), Tekne.Troms_Level : INCR beatcounter 'lowbongo IF beatcounter < 4 THEN IF BIT (i,4) THEN mPlay Troms.Channel, 41 + (j MOD 3), Tekne.Troms_Level : INCR beatcounter 'highbongo END IF IF beatcounter < 4 THEN IF BIT (i,5) THEN mPlay Troms.Channel, 44 + (j MOD 2), Tekne.Troms_Level : INCR beatcounter 'lowminibongo END IF IF beatcounter < 4 THEN IF BIT (i,6) THEN mPlay Troms.Channel, 46 + (j MOD 2), Tekne.Troms_Level :INCR beatcounter 'highminibongo END IF INCR j IF j > 7 THEN j = %False Beatcounter = %False END IF ' ROTOMOTON - doubled with Temblo and Snar (01.06.2014) IF Tekne.Rotomoton_Tog THEN IF Tekne.RotoMoton_Level THEN i = cnt AND &H07F IF h THEN ROTATE LEFT i,h IF BIT (i,0) THEN mPlay Rotomoton.Channel, 48 + (h MOD 3), Tekne.Rotomoton_Level 'bas mPlay Temblo.channel,60, Tekne.Rotomoton_Level END IF IF BIT (i,1) THEN mPlay RotoMoton.Channel, 51 + (h MOD 3), Tekne.Rotomoton_Level 'tenor mPlay Temblo.channel, 61, Tekne.rotomoton_Level END IF IF BIT (i,2) THEN mPlay RotoMoton.Channel, 54 + (h MOD 2), Tekne.Rotomoton_Level 'alto mPlay Temblo.channel, 62, Tekne.rotomoton_level END IF IF BIT (i,3) THEN mPlay Rotomoton.Channel, 56 + (h MOD 2), Tekne.Rotomoton_Level 'mezzo mPlay Temblo.channel, 63, Tekne.rotomoton_Level END IF IF BIT (i,4) THEN mPlay Rotomoton.Channel, 58 + (h MOD 2), Tekne.Rotomoton_Level 'soprano mPlay Temblo.channel, 64, Tekne.rotomoton_level END IF IF BIT (i,5) THEN ' added 01.06.2014 mPlay Temblo.channel, 65, Tekne.rotomoton_level END IF IF BIT (i,6) THEN IF ISFALSE BIT(Tekne.Rotomoton_on,0) THEN mPlay Rotomoton.Channel, 114, 1 ' lights BIT SET Tekne.Rotomoton_on, 0 END IF ELSE IF BIT (Tekne.Rotomoton_on,0) THEN mPlay Rotomoton.Channel, 114, 0 BIT RESET Tekne.Rotomoton_on, 0 END IF END IF IF BIT (i,7) THEN IF ISFALSE BIT(Tekne.Rotomoton_on,1) THEN mPlay Rotomoton.Channel, 115, 1 ' lights BIT SET Tekne.Rotomoton_On,1 END IF ELSE IF BIT (tekne.Rotomoton_on,1) THEN mPlay Rotomoton.Channel, 115, 0 BIT RESET Tekne.Rotomoton_on, 1 END IF END IF INCR h IF h > 5 THEN h = %False ELSE ' doof alle lichten IF BIT (Tekne.Rotomoton_on,0) THEN mPlay Rotomoton.Channel, 114, 0 BIT RESET Tekne.Rotomoton_on, 0 END IF IF BIT (tekne.Rotomoton_on,1) THEN mPlay Rotomoton.Channel, 115, 0 BIT RESET Tekne.Rotomoton_on, 1 END IF END IF END IF ' KLUNG IF Tekne.Klung_level THEN i = cnt AND &H0FF i = Gray (i) SHIFT RIGHT i, 1 IF LOBYT(i) AND &H0F THEN IF oldklungnoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldklungnoot, klung.lowtes, klung.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har,klung.lowtes, klung.lowtes, klung.Hightes) END IF IF noot > %False THEN IF BIT (i,0) THEN mPlay Klung.Channel, noot, Tekne.Klung_level AddNote2Har Task(%Faust_Tekne_Harm).Har, noot, Tekne.Klung_level oldklungnoot = noot ELSEIF BIT (i,1) THEN mPlay Klung.Channel, noot, Tekne.Klung_level AddNote2Har Task(%Faust_Tekne_Harm).Har, noot, Tekne.Klung_level oldklungnoot = noot ELSEIF BIT (i,2) THEN mPlay Klung.Channel, noot, Tekne.Klung_level AddNote2Har Task(%Faust_Tekne_Harm).Har, noot, Tekne.Klung_level oldklungnoot = noot ELSEIF BIT (i,3) THEN mPlay Klung.Channel, noot, Tekne.Klung_level AddNote2Har Task(%Faust_Tekne_Harm).Har, noot, Tekne.Klung_level oldklungnoot = noot END IF noot = %False ELSE Faust_GetSpectralChord oldklungnoot = %False END IF END IF ELSE ' all off... oldklungnoot = %False END IF ' thunderwood: IF Tekne.ThunderWood_Tog THEN IF Tekne.ThunderWood_Level THEN i = cnt AND &H3FF IF n THEN ROTATE LEFT i,n IF BIT (i,3) THEN mPlay ThunderWood.Channel, 1 + (n MOD 6), Tekne.ThunderWood_Level ' bassblock ELSEIF BIT (i,2) THEN mPlay ThunderWood.Channel, 6 + (n MOD 4), Tekne.ThunderWood_Level ' tenorblock ELSEIF BIT (i,1) THEN mPlay ThunderWood.Channel, 10 + (n MOD 3), Tekne.ThunderWood_Level ' altoblock ELSEIF BIT (i,0) THEN mPlay ThunderWood.Channel, 13 + (n MOD 3), Tekne.ThunderWood_Level ' high block END IF IF Tekne.ThunderWood_Level > 64 THEN IF BIT (i,4) THEN mPlay ThunderWood.Channel, 15, 127 ' ratchet BIT SET Tekne.ThunderWood_On,1 ELSE IF BIT(Tekne.ThunderWood_On,1) THEN mPlay ThunderWood.Channel, 15,0 BIT RESET Tekne.ThunderWood_On,1 END IF END IF ' IF BIT (i,5) THEN mPlay ThunderWood.Channel, 16, Tekne.ThunderWood_Level ' rain IF BIT (i,5) THEN mPlay ThunderWood.Channel, 17, Tekne.ThunderWood_Level ' chimes IF BIT (i,6) THEN mPlay ThunderWood.Channel, 19, Tekne.ThunderWood_Level ' thundersheet IF BIT (i,7) THEN mPlay ThunderWood.Channel, 24, Tekne.ThunderWood_Level ' wind-machine,was 21 - should be 24 !!! ELSE NoteOff ThunderWood.Channel, 24 ' added 22.12.2002 END IF IF Tekne.ThunderWood_Level > 64 THEN IF BIT (i,8) THEN mPlay ThunderWood.Channel, 25, Tekne.ThunderWood_Level ' storm END IF IF BIT (i,9) THEN mPlay ThunderWood.Channel, 0, 127 ' lightning INCR n IF n > 10 THEN n = 0 mPlay ThunderWood.Channel, 0, 0 ' lightning off END IF BIT SET Tekne.ThunderWood_On,0 ELSE IF Tekne.ThunderWood_On THEN 'InstrumallNotesOff ThunderWood ' to be checked: this should not switch power off! MM_ThunderWood_Off %MM_Notes Tekne.ThunderWood_On = %False END IF END IF END IF ' Belly [ maybe extended with vacca, vitello and Llor, using playkloks] IF Tekne.Belly_Level THEN i = cnt AND &H1FF ROTATE LEFT i,p IF (LOBYT(i) AND &H0F) THEN IF oldbellynoot THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldbellynoot, Belly.lowtes, Belly.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, Belly.lowtes, Belly.Hightes) END IF IF noot > %False THEN IF BIT (i,3) THEN IF PlayBelly (noot, Tekne.Belly_Level, 20) THEN 'Play Belly.Channel, noot, Tekne.Belly_Level oldbellynoot = noot END IF ELSEIF BIT (i,2) THEN IF PlayBelly (noot, Tekne.Belly_Level, 20) THEN 'Play Belly.Channel, noot, Tekne.Belly_Level oldbellynoot = noot END IF ELSEIF BIT (i,1) THEN IF PlayBelly (noot, Tekne.Belly_Level, 20) THEN 'Play Belly.Channel, noot, Tekne.Belly_Level oldbellynoot = noot END IF ELSEIF BIT (i,0) THEN IF Playbelly (noot, Tekne.Belly_Level, 20) THEN 'Play Belly.Channel, noot, Tekne.Belly_Level oldbellynoot = noot END IF END IF noot = %False ELSE oldbellynoot = %False Faust_GetSpectralChord END IF END IF INCR p IF p > 6 THEN p = 0 ELSE ' all off... oldbellynoot = %False END IF ' SPRINGERS - mapping updated 14.05.2007 IF Tekne.Springers_Tog THEN IF Tekne.Springers_Level THEN i = cnt AND &H1FF ROTATE LEFT i,r IF BIT (i,0) THEN mPlay Springers.Channel,72, Tekne.Springers_Level ' shaker 1 IF BIT (i,1) THEN mPlay Springers.Channel,79, Tekne.Springers_Level ' shaker 2 IF BIT (i,2) THEN mPlay Springers.Channel,36, Tekne.Springers_Level ' spring 1 ELSEIF BIT (i,3) THEN mPlay Springers.Channel,37, Tekne.Springers_Level ' spring 2 ELSEIF BIT (i,4) THEN mPlay Springers.Channel,38, Tekne.Springers_Level ' spring 3 ELSEIF BIT (i,5) THEN mPlay Springers.Channel,39, Tekne.Springers_Level ' spring 4 ELSEIF BIT (i,6) THEN mPlay Springers.Channel,40, Tekne.Springers_Level ' spring 5 END IF INCR r IF r > 6 THEN r = 0 Tekne.Springers_On = %True ELSE IF Tekne.Springers_On THEN Tekne.Springers_On = %False END IF END IF END IF ' PIPEROLA - doubled with Qt i = cnt AND &H05F ROTATE LEFT i,t IF LOBYT(i) AND &H0F THEN IF oldpipnoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldpipnoot, piperola.lowtes, piperola.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, piperola.lowtes, piperola.Hightes) END IF IF noot > %False THEN IF BIT (i,0) THEN IF oldpipnoot THEN IF noot <> oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot NoteOff Qt.channel, oldpipnoot END IF END IF mPlay Piperola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldpipnoot = noot ELSEIF BIT (i,1) THEN IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot mPlay Piperola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldpipnoot = noot ELSEIF BIT (i,2) THEN IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot mPlay Piperola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldpipnoot = noot ELSEIF BIT (i,3) THEN IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot mPlay Piperola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldpipnoot = noot ELSE IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot 'NoteOff Qt.channel, oldpipnoot MM_Qt_Off %MM_Notes oldpipnoot = %False END IF END IF ELSE IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot MM_Qt_Off %MM_Notes 'NoteOff Qt.channel, oldpipnoot END IF oldpipnoot = %False Faust_GetSpectralChord END IF ELSE IF oldpipnoot THEN NoteOff Piperola.channel, oldpipnoot Controller Qt.channel, 123, %False oldpipnoot = %False END IF END IF INCR t IF t > 4 THEN t = 0 ' BOURDONOLA - doubled with Qt i = cnt AND &H03F ROTATE LEFT i,v IF LOBYT(i) AND &H0F THEN IF oldbournoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldbournoot, bourdonola.lowtes, bourdonola.Hightes) ELSE ' changed 28.07.2002 to: noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, bourdonola.lowtes, bourdonola.lowtes, bourdonola.Hightes) ' was: 'noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har,-1, bourdonola.lowtes, bourdonola.Hightes) END IF IF noot > %False THEN IF BIT (i,0) THEN IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot mPlay Bourdonola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldbournoot = noot ELSEIF BIT (i,1) THEN IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot mPlay Bourdonola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldbournoot = noot ELSEIF BIT (i,2) THEN IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot mPlay Bourdonola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldbournoot = noot ELSEIF BIT (i,3) THEN IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot mPlay Bourdonola.Channel, noot, 64 mPlay Qt.channel, noot, 64 oldbournoot = noot ELSE IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot NoteOff Qt.channel, oldbournoot oldbournoot = %False END IF END IF noot = %False ELSE Faust_GetSpectralChord IF oldbournoot THEN NoteOff Bourdonola.channel, oldbournoot NoteOff Qt.channel, oldbournoot oldbournoot = %False END IF END IF END IF INCR v IF v > 5 THEN v = 0 ' PIANO IF Tekne.Piano_Level THEN i = cnt AND &H07F ROTATE LEFT i,x IF LOBYT(i) AND &H0F THEN IF oldpianoot > %False THEN 'pianoot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, 48 + (oldpianoot MOD 12), piano.lowtes, piano.Hightes) noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldpianoot, piano.lowtes, piano.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, piano.lowtes, piano.Hightes) SELECT CASE i MOD 4 CASE 0 IF noot > 36 THEN noot = 24 + (noot MOD 12) CASE 1 IF noot > 47 THEN noot = 36 + (noot MOD 12) CASE 2 IF noot > 59 THEN noot = 48 + (noot MOD 12) CASE 3 IF noot > 71 THEN noot = 60 + (noot MOD 12) END SELECT END IF IF noot > %False THEN IF BIT (i,0) THEN AddNote2Har Piano.Har(1), noot, Tekne.Piano_Level oldpianoot = noot noot = noot + 12 IF noot > piano.hightes THEN noot= ((piano.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,1) THEN AddNote2Har Piano.Har(1), noot, Tekne.Piano_Level oldpianoot = noot noot = noot + 7 IF noot > piano.hightes THEN noot= ((piano.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,2) THEN AddNote2Har Piano.har(1), noot, Tekne.Piano_Level oldpianoot = noot noot = noot + 5 IF noot > piano.hightes THEN noot= ((piano.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,3) THEN AddNote2Har Piano.Har(1), noot, Tekne.Piano_Level oldpianoot = noot noot = noot + 3 IF noot > piano.hightes THEN noot= ((piano.hightes \ 12)* 12 )+ (noot MOD 12) END IF Task(%Faust_Tekne_Harm).Har.vel = SumHar$(Task(%Faust_Tekne_Harm).Har, Piano.Har(1)) Instrumplay Piano Tekne.Piano_on = %True ELSE IF Tekne.Piano_on THEN InstrumAllNotesOff Piano : Tekne.Piano_on = %False Faust_GetSpectralChord oldpianoot = %False END IF noot = %False ELSE IF Tekne.Piano_on THEN InstrumAllNotesOff Piano : Tekne.Piano_on = %False oldpianoot = %False END IF INCR x IF x > 4 THEN x = 0 END IF ' HUMANOLA [ doubled with Krum, 31.05.2014] i = cnt AND &H03F ROTATE LEFT i,z IF LOBYT(i) AND &H0F THEN IF oldhumnoot > %False THEN IF oldhumnoot > (humanola.Hightes \ 12) * 12 THEN NoteOff humanola.channel, oldhumnoot NoteOff Krum.channel, oldhumnoot oldhumnoot = humanola.lowtes END IF noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldhumnoot, humanola.lowtes, humanola.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, humanola.lowtes, humanola.Hightes) IF (i AND 1) = 1 THEN IF noot > humanola.lowtes + 11 THEN noot = humanola.lowtes + (noot MOD 12) ELSE IF noot > humanola.lowtes + 23 THEN noot = humanola.lowtes + 12 + (noot MOD 12) END IF END IF IF noot > %False THEN IF BIT (i,0) THEN IF oldhumnoot THEN NoteOff humanola.channel, oldhumnoot NoteOff krum.channel, oldhumnoot END IF mPlay humanola.Channel, noot, 64 mPlay Krum.channel, noot, 64 oldhumnoot = noot ELSEIF BIT (i,1) THEN IF oldhumnoot THEN NoteOff humanola.channel, oldhumnoot NoteOff krum.channel, oldhumnoot END IF mPlay Humanola.Channel, noot, 64 mplay Krum.channel, noot, 64 oldhumnoot = noot ELSEIF BIT (i,2) THEN IF oldhumnoot THEN NoteOff humanola.channel, oldhumnoot NoteOff krum.channel, oldhumnoot END IF mPlay Humanola.Channel, noot, 64 mPlay Krum.channel, noot, 64 oldhumnoot = noot ELSEIF BIT (i,3) THEN IF oldhumnoot THEN NoteOff humanola.channel, oldhumnoot NoteOff krum.channel, oldhumnoot END IF mPlay humanola.Channel, noot, 64 mPlay Krum.channel, noot, 64 oldhumnoot = noot ELSE IF oldhumnoot THEN NoteOff Humanola.channel, oldhumnoot NoteOff Krum.channel, oldhumnoot END IF oldhumnoot = %False END IF noot = %False ELSE Faust_GetSpectralChord IF oldhumnoot THEN NoteOff Humanola.channel, oldhumnoot NoteOff Krum.channel, oldhumnoot END IF oldhumnoot = %False END IF ELSE IF oldhumnoot THEN Noteoff Humanola.channel, oldhumnoot NoteOff Krum.channel, oldhumnoot oldhumnoot = %False END IF END IF INCR z IF z > 5 THEN z = 0 ' HARMA [ should be doubled with HarmO] IF Tekne.Harma_Level THEN IF BIT (cnt,0) THEN ' causes harma to mPlay at half tempo i = cnt SHIFT RIGHT i,1 i = cnt AND &H7F IF q THEN ROTATE LEFT i,q IF LOBYT(i) AND &H0F THEN IF oldharmanoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldharmanoot, harma.lowtes, harma.Hightes) Delnote2har Harma.har(1), oldharmanoot NoteOff Harma.channel, oldharmanoot oldharmanoot = %False ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, harma.lowtes, harma.Hightes) END IF IF noot > %False THEN oldharmanoot = noot IF BIT (i,0) THEN AddNote2Har Harma.Har(1), noot, Tekne.Harma_Level OR 64 noot = noot - 12 IF noot < harma.lowtes THEN noot= ((harma.lowtes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,1) THEN AddNote2Har Harma.Har(1), noot, Tekne.Harma_Level OR 64 noot = noot - 7 IF noot < harma.lowtes THEN noot= ((harma.lowtes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,2) THEN AddNote2Har Harma.har(1), noot,Tekne.Harma_Level OR 64 noot = noot - 5 IF noot < harma.lowtes THEN noot= ((harma.lowtes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,3) THEN AddNote2Har Harma.Har(1), noot, Tekne.Harma_Level OR 64 noot = noot - 3 IF noot < harma.lowtes THEN noot= ((harma.lowtes \ 12)* 12 )+ (noot MOD 12) END IF Task(%Faust_Tekne_Harm).Har.vel = SumHar$(Task(%Faust_Tekne_Harm).Har, Harma.Har(1)) Instrumplay Harma Tekne.Harma_on = %True noot = %False ELSE IF Tekne.Harma_on THEN InstrumAllNotesOff Harma Faust_GetSpectralChord oldharmanoot = %False Tekne.Harma_on = %False END IF END IF INCR q IF q > 6 THEN q = 0 END IF ELSE IF Tekne.Harma_on = %True THEN InstrumAllNotesOff Harma oldharmanoot = %False Tekne.Harma_on = %False ELSEIF ISFALSE Tekne.Harma_on THEN noot = App.Globton + 24 IF noot < 29 THEN noot = noot + 12 AddNote2Har Harma.Har(1), noot, 120 oldharmanoot = noot Instrumplay Harma Tekne.Harma_on = 3 ELSEIF Tekne.Harma_on = 3 THEN IF App.Globton <> (oldharmanoot MOD 12) THEN InstrumAllNotesOff Harma noot = App.Globton + 24 IF noot < 29 THEN noot = noot + 12 AddNote2Har Harma.Har(1), noot, 120 oldharmanoot = noot Instrumplay Harma Tekne.Harma_on = 3 END IF END IF END IF ' VIBI IF Tekne.Vibi_Level THEN i = cnt AND &H3FF IF m THEN ROTATE LEFT i,m IF LOBYT(i) AND &H0F THEN IF oldvibinoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldvibinoot, vibi.lowtes, vibi.Hightes) oldvibinoot = vibi.lowtes ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, vibi.lowtes, vibi.Hightes) END IF IF noot > %False THEN IF BIT (i,0) THEN AddNote2Har vibi.Har(1), noot, Tekne.Vibi_Level oldvibinoot = noot noot = noot + 12 IF noot > vibi.hightes THEN noot= ((vibi.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,1) THEN AddNote2Har vibi.Har(1), noot, Tekne.Vibi_Level oldvibinoot = noot noot = noot + 7 IF noot > vibi.hightes THEN noot= ((vibi.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,2) THEN AddNote2Har vibi.har(1), noot, Tekne.Vibi_Level oldvibinoot = noot noot = noot + 5 IF noot > vibi.hightes THEN noot= ((vibi.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,3) THEN AddNote2Har vibi.Har(1), noot, Tekne.Vibi_Level oldvibinoot = noot noot = noot + 3 IF noot > vibi.hightes THEN noot= ((vibi.hightes \ 12)* 12 )+ (noot MOD 12) END IF Task(%Faust_Tekne_Harm).Har.vel = SumHar$(Task(%Faust_Tekne_Harm).Har, vibi.Har(1)) Instrumplay vibi Tekne.Vibi_On = %True ELSE IF Tekne.Vibi_On THEN InstrumAllNotesOff Vibi Tekne.Vibi_On = %False Faust_GetSpectralChord oldvibinoot = %False noot = %False END IF INCR m IF m > 5 THEN m = 0 END IF ELSE IF Tekne.Vibi_On THEN InstrumAllNotesOff Vibi Tekne.Vibi_On = %False END IF ' XY IF Tekne.Xy_Level THEN i = cnt AND &H3FF IF y THEN ROTATE LEFT i,y IF LOBYT(i) AND &H0F THEN IF oldxynoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldxynoot, xy.lowtes, xy.Hightes) oldxynoot = xy.lowtes ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, xy.lowtes, xy.Hightes) END IF IF noot > %False THEN IF BIT (i,0) THEN AddNote2Har xy.Har(1), noot, Tekne.xy_Level oldxynoot = noot noot = noot + 12 IF noot > xy.hightes THEN noot= ((xy.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,1) THEN AddNote2Har xy.Har(1), noot, Tekne.xy_Level oldxynoot = noot noot = noot + 7 IF noot > xy.hightes THEN noot= ((xy.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,2) THEN AddNote2Har xy.har(1), noot, Tekne.xy_Level oldxynoot = noot noot = noot + 5 IF noot > xy.hightes THEN noot= ((xy.hightes \ 12)* 12 )+ (noot MOD 12) END IF IF BIT (i,3) THEN AddNote2Har xy.Har(1), noot, Tekne.xy_Level oldxynoot = noot noot = noot + 3 IF noot > xy.hightes THEN noot= ((xy.hightes \ 12)* 12 )+ (noot MOD 12) mPlay Xyq.channel, noot, 84 ' kwarttoons terts END IF Task(%Faust_Tekne_Harm).Har.vel = SumHar$(Task(%Faust_Tekne_Harm).Har, xy.Har(1)) Instrumplay xy Tekne.xy_On = %True ELSE Tekne.Xy_On = %False Faust_GetSpectralChord oldXynoot = %False noot = %False END IF INCR y IF y > 5 THEN y = 0 END IF ELSE Tekne.Xy_On = %False END IF ' SAX IF Tekne.Sax_Tog THEN ' 24.07.2003 - switched on in meta task. IF Tekne.Sax_Level > 50 THEN ' uses same level as for klung! - > 50 added 23.07.2003 ' should make longer notes & melodies. 'Tekne.Sax_Level = Tekne.Sax_Level OR &H0F i = cnt AND &H0F IF s THEN ROTATE LEFT i,s IF LOBYT(i) AND &H0F THEN IF oldsaxnoot > %False THEN noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, oldsaxnoot, autosax.lowtes, autosax.Hightes) ELSE noot = StealNoteFromHar (Task(%Faust_Tekne_Harm).Har, -1, autosax.lowtes, autosax.Hightes) IF noot > 59 THEN noot = 48 + (noot MOD 12) END IF IF noot <= %False THEN Faust_GetSpectralChord ELSE 'IF noot > %False THEN IF BIT (i,1) THEN IF ISFALSE Tekne.Sax_on THEN mPlay AutoSax.Channel, noot, Tekne.Sax_Level oldsaxnoot = noot Tekne.Sax_on = %True END IF END IF END IF noot = %False ELSE IF oldsaxnoot > %False THEN NoteOff AutoSax.channel, oldsaxnoot oldsaxnoot = %False Tekne.Sax_on = %False END IF END IF INCR s IF s > 4 THEN s = 0 ELSE IF Tekne.Sax_on THEN NoteOff AutoSax.channel, oldsaxnoot oldsaxnoot = %False Tekne.Sax_on = %False END IF END IF END IF ' castagnetten: (uitgebreid naar 16 castagnetten & casta2 : done 14.05.2007 IF Tekne.Klung_Level THEN i = cnt AND &H0FFFF i = Gray(i) oi = Gray(i-1) 'new 14.05.2007 FOR cacnt = 0 TO 15 IF BIT(i,cacnt) THEN IF ISFALSE BIT(oi, cacnt) THEN mPlay Casta.Channel,112 + cacnt,Tekne.Klung_Level END IF ELSE IF BIT(oi, cacnt) THEN mPlay Casta2.channel, 112 + cacnt, Tekne.Klung_Level END IF END IF NEXT cacnt ' obsolete coding: ' IF BIT (i,0) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,0) THEN ' Play Casta.Channel, 120, 64 ' BIT SET Tekne.Humanola_on, 0 ' ELSE ' 'Play Humanola.Channel, 120, 0 ' BIT RESET Tekne.Humanola_on,0 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,0) THEN ' Play Humanola.Channel, 120, 0 ' BIT RESET Tekne.Humanola_on,0 ' END IF ' END IF ' IF BIT (i,1) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,1) THEN ' Play Humanola.Channel, 121, 64 ' BIT SET Tekne.Humanola_on,1 ' ELSE ' 'Play Humanola.Channel, 121, 0 ' BIT RESET Tekne.Humanola_on,1 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,1) THEN ' 'Play Humanola.Channel, 121, 0 ' BIT RESET Tekne.Humanola_on,1 ' END IF ' END IF ' IF BIT (i,2) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,2) THEN ' Play Humanola.Channel, 122, 64 ' BIT SET Tekne.Humanola_on,2 ' ELSE ' 'Play Humanola.Channel, 122, 0 ' BIT RESET Tekne.Humanola_on,2 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,2) THEN ' 'Play Humanola.Channel, 122, 0 ' BIT RESET Tekne.Humanola_on,2 ' END IF ' END IF ' IF BIT (i,3) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,3) THEN ' Play Humanola.Channel, 123, 64 ' BIT SET Tekne.Humanola_on,3 ' ELSE ' 'Play Humanola.Channel, 123, 0 ' BIT RESET Tekne.Humanola_on,3 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,3) THEN ' 'Play Humanola.Channel, 123, 0 ' BIT RESET Tekne.Humanola_on,3 ' END IF ' END IF ' IF BIT (i,4) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,4) THEN ' Play Humanola.Channel, 124, 64 ' BIT SET Tekne.Humanola_on,4 ' ELSE ' 'Play Humanola.Channel, 124, 0 ' BIT RESET Tekne.Humanola_on,4 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,4) THEN ' 'Play Humanola.Channel, 124, 0 ' BIT RESET Tekne.Humanola_on,4 ' END IF ' END IF ' IF BIT (i,5) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,5) THEN ' Play Humanola.Channel, 125, 64 ' BIT SET Tekne.Humanola_on,5 ' ELSE ' 'Play Humanola.Channel, 125, 0 ' BIT RESET Tekne.Humanola_on,5 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,5) THEN ' 'Play Humanola.Channel, 125, 0 ' BIT RESET Tekne.Humanola_on,5 ' END IF ' END IF ' ' IF BIT (i,6) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,6) THEN ' Play Humanola.Channel, 126, 64 ' BIT SET Tekne.Humanola_on,6 ' ELSE ' 'Play Humanola.Channel, 126, 0 ' BIT RESET Tekne.Humanola_on,6 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,6) THEN ' 'Play Humanola.Channel, 126, 0 ' BIT RESET Tekne.Humanola_on,6 ' END IF ' END IF ' IF BIT (i,7) THEN ' IF ISFALSE BIT (Tekne.Humanola_on,7) THEN ' Play Humanola.Channel, 127, 64 ' BIT SET Tekne.Humanola_on,7 ' ELSE ' 'Play Humanola.Channel, 127, 0 ' BIT RESET Tekne.Humanola_on,7 ' END IF ' ELSE ' IF BIT (Tekne.Humanola_on,7) THEN ' 'Play Humanola.Channel, 127, 0 ' BIT RESET Tekne.Humanola_on,7 ' END IF ' END IF END IF INCR cnt END SUB 'SUB Faust_Tekne_Harm () ' ' no longer in use as task, but we do use this tasks Har structures!!! ' ' can be deleted from file. ' LOCAL i AS DWORD ' STATIC cnt AS DWORD ' STATIC strongest AS INTEGER ' IF ISFALSE Task(%Faust_Tekne_Harm).tog THEN ' Task(%Faust_Tekne_Harm).Har.vel = NUL$(128) ' Task(%Faust_Tekne_Harm).freq = Task(%Faust_Tekne1).freq / 32 ' Task(%Faust_Tekne_Harm).tog = %True ' Faust_GetSpectralChord ' END IF ' ' strongest = GetStrongest% (Task(%Faust_Tekne_Harm).Har, 1) ' IF strongest < %False THEN ' Faust_GetSpectralChord ' strongest = GetStrongest% (Task(%Faust_Tekne_Harm).Har, 1) ' END IF ' ' EXIT SUB ' ' ' SELECT CASE cnt MOD 8 ' CASE 0 ' ' no changes ' CASE 1 ' Task(%Faust_Tekne_Harm).har.vel = SolveMin2$ (Task(%Faust_Tekne_Harm).Har,%False, 0.6) ' CASE 2 ' Task(%Faust_Tekne_Harm).har.vel = SolveMaj2$ (Task(%Faust_Tekne_Harm).Har,%False, 0.6) ' CASE 3 ' Task(%Faust_Tekne_Harm).har.vel = SolveTrit$ (Task(%Faust_Tekne_Harm).Har,%False, 0.6) ' CASE 4 ' strongest = 60 + strongest ' Task(%Faust_Tekne_Harm).har.vel = ConvergeHar$ (Task(%Faust_Tekne_Harm).Har, strongest, 1.2!) ' CASE 5 ' strongest = 60 + strongest ' Task(%Faust_Tekne_Harm).har.vel = ConvergeHar$ (Task(%Faust_Tekne_Harm).Har, strongest, 0.8!) ' CASE 6 ' strongest = 12 + (strongest MOD 12) ' Task(%Faust_Tekne_Harm).har.vel = ConvergeHar$ (Task(%Faust_Tekne_Harm).Har, strongest, 1.1!) ' CASE 7 ' strongest = 96 + (strongest MOD 12) ' Task(%Faust_Tekne_Harm).har.vel = ConvergeHar$ (Task(%Faust_Tekne_Harm).Har, strongest, 0.9!) ' END SELECT ' ' INCR cnt 'END SUB SUB Faust_GetSpectralChord () ' this is task %Faust_Tekne_Spek LOCAL i AS DWORD STATIC cnt, otc, prevcall AS DWORD Task(%Faust_Tekne_Harm).Har.Vel = NUL$(128) i = GetPromil ' 0-1000 IF i > prevcall THEN prevcall = i + 10 ' so the harmony will change every 7.2 seconds ELSE ' check existance of harmony string first? Task(%Faust_Tekne_Harm).Har = Task(%Faust_Tekne_Spek).Har EXIT SUB END IF SELECT CASE cnt MOD 8 '5 CASE 0 App.Globton = (App.Globton + 7) MOD 12 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,5,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,7,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,9,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 CASE 1 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0,%DomSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,9,0,%DomSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,5,0,%DomSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,7,0,%Domspec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 i = SpectralNote (App.Globton + 12, 13,0,%Domspec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 80 CASE 2 App.Globton = (App.Globton + 7) MOD 12 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,9,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 12,13,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,11,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 CASE 3 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0,%ParMinSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,7,0,%ParMinSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,5,0,%ParMinSpec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,9,0,%ParMinspec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 i = SpectralNote (App.GlobTon + 24,11,0,%ParMinspec) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 CASE 4 App.GlobTon = (App.Globton + 9) MOD 12 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,5,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,7,0, %true) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,11,0,%True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 i = SpectralNote (App.Globton + 12,13,0, %True) AddShNo2Har Task (%Faust_Tekne_Harm).Har, i, 80 CASE 5 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,5,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,7,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,9,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,13,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 CASE 6 App.GlobTon = (App.Globton + 5) MOD 12 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,3,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,5,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 24,7,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 24,11,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 i = SpectralNote (App.Globton + 24,13,0, %True) AddShNo2Har Task (%Faust_Tekne_Harm).Har, i, 80 CASE 7 AddShNo2Har Task(%Faust_Tekne_Harm).Har, 48 + App.Globton, 100 i = SpectralNote (App.Globton + 24,7,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 94 i = SpectralNote (App.GlobTon + 24,9,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 88 i = SpectralNote (App.GlobTon + 12,13,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 82 i = SpectralNote (App.GlobTon + 12,15,0, %True) AddShNo2Har Task(%Faust_Tekne_Harm).Har, i, 76 END SELECT FillHarType Task(%Faust_Tekne_Harm).Har Task(%Faust_Tekne_Spek).Har = Task(%Faust_Tekne_Harm).Har ' for display and debug. ' use to sound the fundamental as it changes: [ added 01.06.2014] IF otc <> App.Globton THEN PlayDur So.channel, 12 + (App.GlobTon MOD 12), 120, 1000 otc = App.Globton END IF ' ------------------------------------------------------------------- INCR cnt END SUB SUB Faust_Tekne_Meta () ' meta scoring task for LOCAL t AS DWORD STATIC Xy_lites, ot, Qt_Lites, Klung_Lites, All_Lites AS DWORD IF ISFALSE Task(%Faust_Tekne_Meta).tog THEN App.Globton = %False App.tempo = 120 Task(%Faust_Tekne_Meta).tog = %True Task(%Faust_Tekne_Meta).freq = 1 SpekFak = 1! MM_Piperola_On %MM_Motor OR %MM_Wind MM_Humanola_On %MM_Motor OR %MM_WIND MM_Thunderwood_On MM_Krum_On RESET ot ProgChange mDisp_A.channel, 0 Tekne.Sax_Tog = %False END IF ' here we should add more instrumentation toggles. t = GetPromil ' with a duration of 420 seconds (7'), one unit of t = 420ms ' this task runs at the start at 1Hz, so on each call, t will have incremented with at least 2 units. SELECT CASE t CASE < 64 '32 '29 ' 21 ' 64 means, during 27 seconds. ' changed 22.07.2003: was * 0.05 App.tempo = App.tempo + (App.tempo * 0.02) ' accellerando 120- 250 IF App.tempo > 250 THEN App.tempo = 250 CASE < 200 ' eerste vijfde van de totale duur: IF ISFALSE xy_lites THEN MM_Xy_On %MM_Lights Xy_Lites = %True END IF App.tempo = 250 Task(%Faust_Tekne_Meta).freq = 0.2 ' om de 5 sekonden CASE < 400 ' tweede vijfde van de totale duur: IF ISFALSE Qt_Lites THEN MM_Qt_On %MM_Lights Qt_lites = %True END IF CASE < 600 ' derde vijfde van de totale duur: IF ISFALSE Klung_Lites THEN MM_Whisper_On %MM_Lights MM_Klung_On %MM_Lights Klung_Lites = %True END IF CASE < 800 ' vierde vijfde van de totale duur: IF ISFALSE All_Lites THEN MM_AllLightsOn All_Lites = %True END IF CASE < 900 Tekne.Sax_Tog = %True ' new App.tempo = 250 Task(%Faust_Tekne_Meta).freq = 0.2 Tekne.speedprop = 508 - (t/4) ' range from 458 to 283 - new 24.07.2002 ' blue rotolite on springers: mPlay Springers.channel, 2, 127 Controller Springers.channel, 70, 36 CASE < 920 Tekne.speedprop = 508 ' reset IF Tekne.ThunderWood_Tog THEN InstrumAllNotesOff ThunderWood Tekne.ThunderWood_Tog = %False ' thunderwood stops participation END IF ' orangerotolights: mPlay Puff.channel, 100, 127 Controller Thunderwood.channel, 70, 40 Controller Springers.channel, 70, 48 CASE < 960 IF Tekne.Harma_Tog THEN Controller Harma.channel,7,50 ' wind low Tekne.Harma_tog = %False END IF mPlay Puff.channel, 101, 127 Controller ThunderWood.channel, 70, 80 Controller Springers.channel, 70, 80 CASE < 980 Task(%Faust_Tekne_Meta).freq = 1 mPlay Puff.channel, 102, 127 Controller Thunderwood.channel, 70, 120 Controller Springers.channel, 70, 127 CASE < 998 Task(%Faust_Tekne_Meta).freq = 10 CASE >= 1000 IF Task(%Faust_Tekne_Harm).swit THEN StopTask %Faust_Tekne_Harm IF Task(%Faust_Tekne_Spek).swit THEN StopTask %Faust_Tekne_Spek IF Task(%Faust_Tekne1).swit THEN StopTask %Faust_Tekne1 IF Task(%Faust_Tekne_Meta).swit THEN StopTask %Faust_Tekne_Meta IF ISFALSE Task(%Faust_Tekne_Bird).tog THEN StartTask %Faust_Tekne_Bird END SELECT ' use display to show promil to the dancer(s) - added and tested ok 01.06.2014 IF t <> ot THEN IF t \ 1000 THEN mPlay mDisp_A.channel, 1, (t \ 1000) MOD 10 IF t \ 100 THEN mPlay mDisp_A.channel, 2, (t \ 100) MOD 10 IF t \ 10 THEN mPlay mDisp_A.channel, 3, (t \ 10) MOD 10 mPlay mDisp_A.channel, 4, t MOD 10 ot = t END IF END SUB SUB Faust_Tekne_Bird () ' bird sound - 12 seconds ending for Tekne. ' springers added 15.12.2002 ' 01.06.2014: bird sound looks like not working... STATIC t, cnt AS DWORD STATIC p() AS DWORD IF ISFALSE Task(%Faust_Tekne_Bird).tog THEN t = timegettime Task(%Faust_Tekne_Bird).duur = 12 ' in seconds REDIM p(12) AS STATIC DWORD MM_Piperola_Off %MM_Motor MM_Humanola_Off %MM_Motor MM_Krum_Off %MM_Motor Task(%Faust_Tekne_Bird).tog = %True END IF Task(%Faust_Tekne_Bird).freq = 5 mPlay Thunderwood.channel, 22, INT(127 * SQR(RND)) ' bird Task(%Faust_Tekne_Bird).freq = SQR(RND) * Task(%Faust_Tekne_Bird).freq cnt = 36 * (RND(1) *5) ' new mapping mPlay Springers.Channel,cnt, 127 IF Task(%Faust_Tekne_Bird).freq < 1 THEN Task(%Faust_Tekne_Bird).freq = 1 SELECT CASE timegettime - t CASE < 1000 IF p(0) = %False THEN mPlay Springers.Channel, 36, 127 p(0) = %True END IF CASE < 2000 IF p(1) = %False THEN mPlay Springers.Channel, 37, 120 p(1) = %True END IF CASE < 3000 IF p(2) = %False THEN mPlay Springers.Channel, 38, 114 p(2) = %True END IF CASE < 4000 IF p(3) = %False THEN mPlay Springers.Channel, 39, 106 p(3) = %True END IF CASE < 5000 IF p(4) = %False THEN mPlay Springers.Channel, 40, 100 p(4) = %True END IF CASE < 6000 IF p(5) = %False THEN mPlay Springers.Channel, 41, 96 p(5) = %True END IF CASE < 7000 IF p(6) = %False THEN mPlay Springers.Channel, 36, 90 p(6) = %True END IF CASE < 8000 IF p(7) = %False THEN mPlay Springers.Channel, 37, 84 p(7) = %True END IF CASE < 9000 IF p(8) = %False THEN mPlay Springers.Channel, 38, 76 p(8) = %True END IF CASE < 10000 IF p(9) = %False THEN mPlay Springers.Channel, 39, 70 mPlay Springers.Channel, 40, 70 p(9) = %True END IF CASE < 11000 IF p(10) = %False THEN mPlay Springers.Channel, 41, 64 mPlay Springers.Channel, 36, 64 p(10) = %True StartTask %Faust_Tekne_Tubi END IF CASE >= 12000 stoptask %Faust_Tekne_Bird END SELECT END SUB SUB Faust_Tekne_Tubi () ' ending with tubi and xy... STATIC cnt AS INTEGER IF ISFALSE Task(%Faust_Tekne_Tubi).tog THEN MM_Tubi_On MM_Xy_On cnt = 72 ' do not take Tubi.LowTes here, since than we get the scale twice! Task(%Faust_Tekne_Tubi).tog = %TRue Task(%Faust_Tekne_Tubi).freq = 4 END IF '... IF ISFALSE (cnt MOD 2) THEN mPlay Tubi.channel, cnt, 64 mPlay Xy.channel, cnt - 12, 64 mPlay Xyq.channel, cnt + 7, 64 ' quartertone fifth ELSE mPlay Tubi.channel, cnt - 36, 64 mPlay Xyq.channel, cnt - 12, 64 mPlay Xy.channel, cnt + 8, 64 END IF INCR cnt Task(%Faust_Tekne_Tubi).freq = Task(%Faust_Tekne_Tubi).freq + 0.2 ' accellerando ' control set text gh.cockpit, %GMT_MSG2, format$(cnt, "000") IF cnt > Tubi.Hightes THEN cnt = %False stoptask %Faust_Tekne_Tubi MM_AllLightsOff END IF END SUB SUB Tekne_fcurve_Slider () LOCAL value AS DWORD ' slider 0 callback, only for Radar research value = Slider(0).value SELECT CASE value CASE %False f_ex = 0 f_fakt = 0 EXIT SUB CASE 64 f_ex = 1 f_Fakt = 1 EXIT SUB CASE > 64 f_ex = (value - 64) / 32! ' range 1 - 2 CASE < 64 f_ex = value / 64! ' 1 / (64/ value) END SELECT f_fakt = Scalingfactor_Exp (64,f_ex) ' range = 64 ' new function in g_indep.dll END SUB '[EOF]