' *************************************************************************** ' * * ' * by Godfried-Willem RAES * ' * 1992 * ' * implemented under GMT * ' * 1999/2009 * ' *************************************************************************** ' 17.07.1999: declarations reside in gmt_bom.bi, both for songbook and bom. ' 23.12.1999: concert at Logos Tetrahedron: BOM & Songbook. (on Lily) ' 24.12.1999: halt / exit buttons refined to avoid accidental exits... ' 02.01.2000: synth should now be selected from menu. No longer read from bom.cfg file!!! ' 22.03.2000: ported to GMT version MT with thread timers ' 14.11.2000: New analog computer built. V3.0 prototype. ' 11.12.2000: run on 600MHz putty o.k. ' 24.01.2001: demo on Putty for MIM ' 19.08.2001: Lily version taken to Vermont (USA), GMT version 5.42 ' with new hardware (ii-2000 board & new transducers) ' 17.02.2002: MIM version split off. ' 25.03.2002: ADStat function upgraded. : may imply changes in Topoi, Recplay and Tance. ' all occurances of AD stat removed here. ' 23.06.2002: preparation for sound symposium Canada. (Putty-version) GMT 5.83 ' 05.04.2003: Revised for Win2000 on , GMT 6.55. ' Belgrado: Songbook on ' 14.04.2003: Start new coding with databuffers in the dll. ' 15.04.2003: elimination of module gmt_ii.inc ' 21.09.2003: sonar control window added (as in Gestrobo). GMT version 7.15 ' All procedures tested with the new code. ' 22.09.2003: @sr.dT made consistent: this is always nr. of samples now. ' bom.dsamp removed from bom-type ' 19.10.2003: code rechecked. Strange levels in Dance..., Unlock does not seem to work anymore. ' 25.10.2003: performance in Barcelona using Ace. ' 31.10.2003: @sr.dT and @sr.dtf removed. ' 01.11.2003: bom.ascale replaced with @sr.ascale. Rechecked in full. Unlock remains a problem... ' 03.11.2003: Topoi repaired. Lock-Unlock now work as they should. GMT version 7.24 ' 03.11.2003: Sonar_Statistics procedures added. ' 19.11.2003: rechecked for Krikri festival. GMT V7.24 ' 29.09.2006: quick check for upgrade MIM. Mim uses code in this module. ' 01.02.2007: rehearsal and check out of BOM code, GMT version 9.16 on Tox. ' 06.02.2007: performance in MIM. ' 07.06.2009: Upgraded to NiDAQmx 8.8 ' 14.05.2014: Display code changed to use the new display ' --------------------------------------------------------------------------- %Rising_Intervalsize = 20 '25 ' - the larger this value the smaller the intervals. %Rising_EndValue = 75 GLOBAL cpPlace AS DWORD 'new 24/6/2006 - since the nidaq upgrade to 7.x linking statically to g_nih.dll causes crashes GLOBAL cpTopo AS DWORD 'these are codepointers for linking dynamically to often used functions FUNCTION InitBom () AS DWORD LOCAL CockpitLayo AS CockpitLabels LOCAL m AS ASCIIZ * 40 LOCAL i AS BYTE LOCAL j AS BYTE LOCAL p AS DWORD LOCAL cptr AS DWORD cpPlace = GetProcAddress(gh.gnh, "PLACE") ' the module must have been loaded! cpTopo = GetPRocAddress(gh.gnh, "TOPO") ' initialisation of globals for BOM: DIM Notes(0 TO 38,0 TO 15,0 TO 15) AS GLOBAL INTEGER ' eerste dim= algo-nummer (16kB) opgelet! dit is NIET het tasknr!!! ' tweede dimensie= sub-nummer ' aangeduid met de variabele 'Bom.mapping' ' derde dimensie= gegevens DIM Patch(0 TO 38, 0 TO 19,0 TO 15) AS GLOBAL INTEGER ' eerste dimensie= algo-nummer (20kB) ' tweede dimensie= 'Bom.Subpatch' variabele ' derde dimensie= patch-data REDIM CcH(23 TO 38, 0 TO 127) AS GLOBAL INTEGER: ' eerste dimensie= algo-nummer. Only used for Songbook modules. ' tweede dimensie= controller-nummer REDIM DFTarray(0 TO 32, 0 TO 1) AS GLOBAL SINGLE ' for Fourier analysis - single REDIM n(0 TO 32) AS GLOBAL BYTE ' legacy coding... REDIM v(0 TO 32) AS GLOBAL BYTE FUNCTION = %False IF App.id = %ID_SONGBOOK99 THEN IF ISFALSE hMidiI(0) THEN ErrorMidiIn : EXIT FUNCTION END IF IF ISFALSE hMidiO(0) THEN ErrorMidiOut: EXIT FUNCTION SelectMidiEquipment $BOMINI, Meq() Update_Midiequipment Meq() IF ISFALSE DAQparams.id THEN FUNCTION = %False : EXIT FUNCTION DAQparams.mode = %DAQ_NI ReadCockpitLabelsFromFile $BOMINI, CockpitLayo Bom_ReadIniFile $BOMINI ' reads bom.hardware for the computer running the program. ' also reads patches and note mappings. ' initialisation of tasks: Task(%Sonar_VU_Task).naam = "" '1 Task(%Sonar_VU_Task).cPtr = GetProcAddress(gh.gnh,"SONAR_II_VU") ' in g_nih.dll Task(%Sonar_VU_Task).freq = 8 Task(%Sonar_VU_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Sonar_Display_Task).naam = "" ' 2 Task(%Sonar_Display_Task).cPtr = GetProcAddress(gh.gnh,"SONAR_DISPLAY") ' in g_nih.dll Task(%Sonar_Display_Task).freq = 21 Task(%Sonar_Display_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Sonar_Stat_Task).naam = "" ' 13 Task(%Sonar_Stat_Task).cptr= GetProcAddress(gh.gnh, "SONAR_STATISTICS_DISPLAY") ' in g_nih.dll Task(%Sonar_Stat_Task).freq = 16 ' also set in dll Task(%Sonar_Stat_Task).channel = 3 ' show statistics for surface channels Task(%Sonar_Stat_Task).flags = %DLL_TASK OR %PERTIM_TASK Task(%Bom_PitchbendTask).naam = "SoloBend" Task(%Bom_PitchbendTask).cPtr = CODEPTR(SoloBend) Task(%Bom_PitchbendTask).freq = 31 Task(%Bom_PitchbendTask).channel = 1 ' must be same as Solo - can be passed via Solo. ' initialisation of tasks: Task(%Open).cPtr = CODEPTR(Ouverture) Task(%Open).level = 127 Task(%Open).freq = 1 Task(%Topoi).cPtr = CODEPTR(Topoi) Task(%Minor).cPtr = CODEPTR(Minor) Task(%Beat).cPtr = CODEPTR(Beat) Task(%Rising).cPtr = CODEPTR(Rising) Task(%Sforte).cPtr = CODEPTR(Sforte) Task(%Lead).cPtr = CODEPTR(Lead) Task(%Canvas).cPtr = CODEPTR(CANVAS) Task(%Close).cPtr = CODEPTR(Sluit) '"Close" Task(%PrimeTime).cPtr = CODEPTR(PrimeTime) Task(%Call).cPtr = CODEPTR(Roep) '"Call" Task(%Spooky).cPtr = CODEPTR(Spooky) Task(%RecPlay).cPtr = CODEPTR(RecPlay) Task(%Lock).cPtr = CODEPTR(Locked) ' "Lock" Task(%Unlock).cptr = CODEPTR(Unlocked) ' "Unlock" Task(%Unlock).naam = "UnLock" Task(%Hammers).cPtr = CODEPTR(Hammers) Task(%Solo).cPtr = CODEPTR(Solo) Task(%Drum).cPtr = CODEPTR(Drum) Task(%Edges).cPtr = CODEPTR(Edges) Task(%Tance).cPtr = CODEPTR(Tance) Task(%Stresso).cPtr = CODEPTR(Stresso) Task(%Jogyaka).cPtr = CODEPTR(Jogyaka) Task(%Tempi).cPtr = CODEPTR(Tempi) Task(%Vox_0).naam = "-K0" ' = 38 Task(%Vox_0).cPtr = CODEPTR(Vox_0) Task(%Vox_0).freq = 2 Task(%Vox_0).channel = 0 Task(%Vox_0).patch = 0 Task(%Vox_0).level = 127 Task(%Vox_0).pan = 64 Task(%Vox_1).naam = "-K1" Task(%Vox_1).cPtr = CODEPTR(Vox_1) Task(%Vox_1).freq = 3 Task(%Vox_1).channel = 1 Task(%Vox_1).patch = 0 Task(%Vox_1).level = 127 Task(%Vox_1).pan = 64 Task(%Vox_2).naam = "-K2" Task(%Vox_2).cPtr = CODEPTR(Vox_2) Task(%Vox_2).freq = 5 Task(%Vox_2).channel = 2 Task(%Vox_2).patch = 0 Task(%Vox_2).level = 127 Task(%Vox_2).pan = 64 Task(%Vox_3).naam = "-K3" Task(%Vox_3).cPtr = CODEPTR(Vox_3) Task(%Vox_3).freq = 7 Task(%Vox_3).channel = 3 Task(%Vox_3).patch = 0 Task(%Vox_3).level = 127 Task(%Vox_3).pan = 64 Task(%Vox_4).naam = "-K4" Task(%Vox_4).cPtr = CODEPTR(Vox_4) Task(%Vox_4).freq = 11 Task(%Vox_4).channel = 4 Task(%Vox_4).patch = 0 Task(%Vox_4).level = 127 Task(%Vox_4).pan = 64 Task(%Vox_5).naam = "-K5" Task(%Vox_5).cPtr = CODEPTR(Vox_5) Task(%Vox_5).freq = 13 Task(%Vox_5).channel = 5 Task(%Vox_5).patch = 0 Task(%Vox_5).level = 127 Task(%Vox_5).pan = 64 Task(%Vox_6).naam = "-K6" Task(%Vox_6).cPtr = CODEPTR(Vox_6) Task(%Vox_6).freq = 19 Task(%Vox_6).channel = 6 Task(%Vox_6).patch = 0 Task(%Vox_6).level = 127 Task(%Vox_6).pan = 64 Task(%RiVox_0).naam = "" Task(%RiVox_0).cPtr = CODEPTR(RiVox_0) Task(%RiVox_0).channel = 0 Task(%RiVox_1).naam = "" Task(%RiVox_1).cPtr = CODEPTR(Rivox_1) Task(%RiVox_1).channel = 2 ' sic!!! Task(%RiVox_2).naam = "" Task(%RiVox_2).cPtr = CODEPTR(RiVox_2) Task(%RiVox_2).channel = 1 ' sic!!! Task(%RiVox_3).naam = "" Task(%RiVox_3).cPtr = CODEPTR(RiVox_3) Task(%RiVox_3).channel = 3 Task(%RiVox_4).naam = "" Task(%RiVox_4).cPtr = CODEPTR(RiVox_4) Task(%RiVox_4).channel = 5 ' no mistake!!! Task(%RiVox_5).naam = "" Task(%RiVox_5).cPtr = CODEPTR(RiVox_5) Task(%RiVox_5).channel = 4 #IF %DEF(%Songbook) InitSongbook ' procedure in Songbook.inc #ENDIF 'Display 0, 0, 0, 1 ' alleen knipperled aan ' cptr = GetPRocAddress(gh.gnh, "LEDDISPLAY") ' CALL DWORD cptr USING LedDisplay(0, 0, 0, 1) ' Bom.algo = %False ' now, 2014: mPlay mDisp_A.channel, 4, 32 ' dot on ' override settings from InitGlobalVariables in main module: App.GlobalHarmonyTaskNr = 15 ' remmed 03.11.2003: ' FOR i = 0 TO UBOUND(Task) ' IF ISFALSE Task(i).flags AND %DLL_TASK THEN ' Task(i).flags = %False ' IF i > 15 THEN Task(i).flags = Task(i).flags OR %MIDI_TASK OR %SCORE_TASK ' 'IF i > App.GlobalHarmonyTaskNr THEN Task(i).flags = Task(i).flags OR %HARM_TASK ' END IF ' NEXT i ' adapt the functions of the buttons in the cockpit & reorients the button handler Bom_RemapCockpitButtons ' only changes contents of arrays. - o.k. Bom_RemapUpDowns ' adapt the function of the function keys and reorient the handler: ' Bom_RemapFunctionKeys ' no longer working under Win2000 and XP !!! ' switch off the flag for auto-patching, since and use many midi channels/patches for ' individual tasks: BIT RESET App.AutoFlags, 0 ' RESETs bit 0 (%AUTOPATCH) ' this suppresses automatic sending of program-change msg's to ' the synth on StartTask commands. m = "Cockpit for & " SELECT CASE Bom.hardware CASE %Anacomp m = m + " Anacom" CASE %Diana m = m + " Diana" CASE %ii_2000 m = "ii_2000 : & " CASE %ii_2000 + 1 m = "ii-2001 : & " END SELECT SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' adapt labels to the sliders in the cockpit: SetDlgItemText gh.Cockpit,%GMT_TEXT_SLIDER0, "@1" & CHR$(0) ' no longer used. SetDlgItemText gh.CockPit,%GMT_TEXT_SLIDER1, "@2" & CHR$(0) 'p = GetSonarPointer cptr = GetPRocAddress(gh.gnh, "GETSONARPOINTER") CALL DWORD cptr USING GetSonarPointer TO p sr = p DIM DataBuf0(255) AS GLOBAL INTEGER AT @sr.pb(0) DIM DataBuf1(255) AS GLOBAL INTEGER AT @sr.pb(1) DIM DataBuf2(255) AS GLOBAL INTEGER AT @sr.pb(2) DIM DataBuf3(255) AS GLOBAL INTEGER AT @sr.pb(3) DIM DataBuf4(255) AS GLOBAL INTEGER AT @sr.pb(4) ' required for edges DIM DataBuf5(255) AS GLOBAL INTEGER AT @sr.pb(5) DIM DataBuf6(255) AS GLOBAL INTEGER AT @sr.pb(6) DIM DataBufC(255) AS GLOBAL INTEGER AT @sr.pb(12) ' required for akselpiek DIM DataBufD(255) AS GLOBAL INTEGER AT @sr.pb(13) DIM DataBufE(255) AS GLOBAL INTEGER AT @sr.pb(14) ' here we can initialize common parameters for the DAQ task: @sr.noise = 0 @sr.dta = 2 @sr.ascale = 1! ' scaling factor for accelleration. 'i = Sonar_DAQ (%DAQ_DOUBLEBUFFER) cptr = GetProcAddress (gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_Daq(%DAQ_DOUBLEBUFFER) TO i Create_Sonar_Control_Task BYVAL sr, Slider(),UDctrl() ' task 10 (pseudotask) 20.09.2003 Task(%Sonar_Control_Task).naam = "S-Ctrl" ' CheckDataArrays ' WriteDaqParams2file "bom_daqparams.dat" SetDlgItemText gh.Cockpit, %GMT_LABEL_TITLE, " &" SetDlgItemText gh.Cockpit, %GMT_TITLE, "" SetDlgItemText gh.Cockpit, %GMT_LABEL_AUTHOR, "by" SetDlgItemText gh.Cockpit, %GMT_AUTHOR, $gwr FUNCTION = %True END FUNCTION SUB CheckDataArrays () ' for debugging: ' can be called from the debug task. Will run once. LOCAL nr AS LONG LOCAL mpn AS LONG LOCAL dataflag AS BYTE LOCAL jl% LOCAL il% LOCAL i AS WORD nr = FREEFILE OPEN "bom\mappings.dat" FOR OUTPUT AS #nr PRINT# nr, "[MAPPINGS]" FOR jl% = 1 TO 38 FOR mpn = 0 TO 15 dataflag = %False FOR il% = 0 TO 15 IF Notes(jl%,mpn,il%) THEN dataflag = %True NEXT il% IF mpn = 0 THEN dataflag = %True IF dataflag THEN IF jl% < 23 THEN ' PRINT# nr, "DATA,",Task(jl% + 15).naam & ",", STR$(jl%) & ",", ELSE ' PRINT# nr, "DATA,",Task(jl% + 25).naam & ",", STR$(jl%) & ",", END IF PRINT# nr, STR$(mpn) & ", "; FOR il% = 0 TO 14 PRINT# nr, STR$(Notes(jl%, mpn, il%)) & ","; NEXT il% PRINT# nr, STR$(Notes(jl%, mpn, 15)) END IF NEXT mpn NEXT jl% PRINT# nr, "[MAPPINGS_END]" CLOSE #nr nr = FREEFILE OPEN "bom\patches.dat" FOR OUTPUT AS #nr PRINT# nr, "[PATCHES]" FOR jl% = 0 TO 38 FOR mpn = 0 TO 19 dataflag = %False FOR il% = 0 TO 15 IF Patch(jl%,mpn,il%) THEN dataflag = %True NEXT il% IF mpn = 0 THEN dataflag = %True IF dataflag THEN IF jl% < 23 THEN ' PRINT# nr, "PATCH,", STR$(jl%) & ",", ELSE ' PRINT# nr, "PATCH,", STR$(jl%) & ",", END IF PRINT# nr, STR$(mpn) & ", "; FOR il% = 0 TO 14 PRINT# nr, STR$(Patch(jl%, mpn, il%)) & ","; NEXT il% PRINT# nr, STR$(Patch(jl%, mpn, 15)) END IF NEXT mpn NEXT jl% PRINT# nr, "[PATCHES_END]" CLOSE #nr END SUB SUB Bom_ReMapCockpitButtons () LOCAL i AS LONG IF ISFALSE hMidiI(0) THEN ButnSW(0).tag0 = "" ' midi-in must be on for songbook END IF ButnSW(1).tag0 = "START" ' start/stop toggle - only used for chrono and general watch... ButnSW(1).tag1 = "STOP" ButnSW(1).cPtr= %False ButnSW(2).tag0 = "Tog On" ' Bom.tog ButnSW(2).tag1 = "Tog Off" ButnSW(2).cptr = %False ButnSW(3).tag0 = "HOLD^ On" ' Bom.sustain was ^ in bom96 ButnSW(3).tag1 = "Hold Off" ButnSW(3).cptr = %False ' ButnSW(4).tag = "HARM " ' creates/kills a harmony display window - = default button ' ButnSW(4).cptr = %False ' this window is now used for sonar statistics. ButnSW(5).tag0 = "S-Chan" ButnSW(5).tag1 = "S-Chan" ButnSW(5).cptr = %False ButnSW(6).tag0 = "" ' harmpsy not required ButnSW(6).tag1 = "" ButnSW(6).cptr = %False ButnSW(7).tag0 = "" ' creates/kills a spectrum display window - no longer required ButnSW(7).tag1 = "" ButnSW(7).cPtr = %False ' now done when the sonar display task is selected. ButnSW(8).tag0 = "Monitor" ButnSW(8).tag1 = "Monitor" ButnSW(8).cptr = %False ' set in bomhol.bas: ' ButnSW(9).tag = "" 'WAV " ' 12.12.2000 ' ButnSW(9).cptr = GetProcAddress(gh.InstDll,UCASE$("ButnSW_StartAudioStreaming")) ButnSW(10).tag0 = "" ButnSW(11).tag0 = "Fade" ' for Shaman ButnSW(11).tag1 = "Fade Off" ButnSW(11).cptr = %False ' ONE SHOT FUNCTIONS: ' remmed because we now use them as replacements for the function keys... ' ButnOS(1).tag = "" ' sound gong in recplay... ' ButnOS(1).cptr = %False ' ButnOS(2).tag = "Equal" ' changes tuning in Bom on Proteus 3. ' ButnOS(2).cptr = %False ' ButnOS(3).tag = "JustC" ' ButnOS(3).cptr = %False ' ButnOS(4).tag = "Valotti" ' ButnOS(4).cptr = %False ' ButnOS(5).tag = "19-tone" ' ButnOS(5).cptr = %False ' ButnOS(6).tag = "gamelan" ' ButnOS(6).cptr = %False ' ButnOS(7).tag = "UserTun" ' ButnOS(7).cptr = %False ' temporary patch for belgrado: ButnOS(1).tag = "F1" ButnOS(1).cptr = %False ButnOS(2).tag = "F2" ButnOS(2).cptr = %False ButnOS(3).tag = "F3" ButnOS(3).cptr = %False ButnOS(4).tag = "F4" ButnOS(4).cptr = %False ButnOS(5).tag = "F5" ButnOS(5).cptr = %False ButnOS(6).tag = "F6" ButnOS(6).cptr = %False ButnOS(7).tag = "F7" ButnOS(7).cptr = %False ButnOS(8).tag = "Clear" ' clears delaylines - should also clear midi-input buffer & DAQ buffers ButnOS(8).cptr = %False ButnOS(9).tag = "" ButnOS(9).cptr = %False ButnOS(10).tag = "" ButnOS(10).cptr = %False App.butnSWCptr = CODEPTR(Bom_ButnSWHandler) App.butnOSCptr = CODEPTR(Bom_ButnOShandler) App.MonitorCptr = GetProcAddress(gh.InstDll,UCASE$("MonitorHandler")) END SUB SUB Bom_ButnSWHandler () LOCAL ButtonNr AS LONG LOCAL i AS DWORD LOCAL m AS ASCIIZ * 10 LOCAL cptr AS DWORD STATIC init AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnSWparam - %GMT_BUTNSW_ID SELECT CASE ButtonNr CASE 1 ' starts the promil counter. IF ISFALSE init THEN init = %True 'Sonar_DAQ %False ' stop DAQ task in dll cptr = GetPRocAddress (gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%false) SetDlgItemText gh.Cockpit, %GMT_TEXT_SR,STR$(DAQparams.samplingrate(0),3) END IF IF ButnSW(ButtonNr).Flag THEN App.MTstart = %True App.tstart = timeGetTime ' start the chronometerfunction SetDlgItemText gh.Cockpit, App.butnSWparam, "STOP" ClearMiBuf 0 ' start with a blank midi input buffer BlockSysExReception hMidiI(0) ' SxThread Runtime %True Promil %True ' Sonar_DAQ %DAQ_DOUBLEBUFFER cptr = GetPRocAddress (gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%DAQ_DOUBLEBUFFER) ELSE App.MTstart = %False SetDlgItemText gh.Cockpit, App.butnSWparam, "CONT" ' Sonar_DAQ %False cptr = GetPRocAddress (gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ(%false) END IF CASE 2 Bom.tog = ButnSW(ButtonNr).flag ' action done in task code... CASE 3 Bom.sustain = ButnSW(ButtonNr).flag ' action done in task code... CASE 5 ' new button, 03.11.2003, creates a parameter window for the statistics task in the ' dll DIM TaskParamLabels(0) AS LOCAL ASCIIZ * 8 LOCAL udnr AS DWORD TaskParamLabels(0) = "channel" IF ISFALSE Task(%Sonar_Stat_Task).hParam THEN MakeTaskParameterDialog %Sonar_Stat_Task,0,Slider(),1,UDctrl(),TaskParamlabels() CONTROL ADD LABEL, Task(%Sonar_Stat_Task).hParam,-1,"Statistic Channel:",1,12,100,10 END IF udnr = TaskEX(%Sonar_Stat_Task).UpDownNumbers(0) UDctrl(udnr).cptr = GetProcAddress(gh.InstDll, "SONAR_STAT_UD") UDctrl(udnr).value = 3 ' 0,1,2 UDctrl(udnr).maxval = 15 UDctrl(udnr).resetval = 3 UDctrl(udnr).minval = 0 Task(%Sonar_Stat_Task).channel = UDctrl(udnr).value CASE 8 IF ButnSW(ButtonNr).flag THEN UpdateMonitor ELSE IF Bom.hMonitor THEN Bom.hMonitor = DestroyWindow (Bom.hMonitor) 'ShowWindow Bom.hMonitor, %SW_HIDE Bom.hMonitor = %False END IF END IF SetFocus gh.Cockpit CASE 11 'this button is used for fade commands in compositions such as Shaman. ' it replaces the TAB key function in previous versions. IF ButnSW(ButtonNr).flag THEN Bom.fade = %True ELSE Bom.fade = %False END IF END SELECT App.butnSWparam = %False ' reset END SUB SUB Bom_ButnOSHandler () LOCAL ButtonNr AS LONG LOCAL i AS DWORD ' replaces the default buttonhandler for the Cockpit window in GMT. ' This proc is called through its codepointer only! ButtonNr = App.butnOSparam - %GMT_BUTNOS_ID SELECT CASE ButtonNr ' CASE 1 TO 16 ' Bom.SubPatch = Functionkeynumber - 1 ' Protpat ' ' we should visualy notify the user... ' UpdateMonitor CASE 1 Bom.Subpatch = 0 Protpat UpdateMonitor 'Play 4, 52, 127 ' gong in Rec-play CASE 2 'Bom.tuning = 0 ' Equal temperament 'Tuning Meq(0),Bom.tuning Bom.Subpatch = 1 ProtPat UpdateMonitor CASE 3 'Bom.tuning = 1 ' Just C Bom.Subpatch = 2 Protpat UpdateMonitor 'Tuning Meq(0),Bom.tuning CASE 4 'Bom.tuning = 2 ' Valotti 'Tuning Meq(0),Bom.tuning Bom.Subpatch = 3 Protpat UpdateMonitor CASE 5 'Bom.tuning = 3 ' 19-tone 'Tuning Meq(0),Bom.tuning Bom.Subpatch = 4 Protpat UpdateMonitor CASE 6 'Bom.tuning = 4 ' gamelan 'Tuning Meq(0), Bom.tuning Bom.Subpatch = 5 Protpat UpdateMonitor CASE 7 'Bom.tuning = 5 ' user tuning 'Tuning Meq(0), Bom.tuning Bom.subpatch = 6 Protpat UpdateMonitor CASE 8 ClearDelayArrays ClearMiBuf 0 CASE 10 IF Bom.tuning <> %False THEN Tuning Meq(0),%False ' reset tuning!!! Halt 'CONTROL ENABLE hCockpit, %GMT_BUTNOS_ID + 11 END SELECT App.butnOSparam = %False ' reset END SUB SUB Bom_RemapUpDowns () EXPORT LOCAL i AS LONG LOCAL iSelMin AS INTEGER LOCAL iSelMax AS INTEGER IF UDCtrl(0).h THEN UDCtrl(0).maxval = 4095 UDCtrl(0).minval = 0 UDCtrl(0).resetval = 2048 UDCtrl(0).value = 2048 UDCtrl(0).stap = 1 UDCtrl(0).hParent = gh.Cockpit UDCtrl(0).ID = %GMT_UPDOWN_ID ' now we have to send the messages... iSelMin = UDCtrl(0).minval iSelMax = UDCtrl(0).maxval SendMessage UDCtrl(0).h, %UDM_SETRANGE, %False, MakeLong(iSelMax, iSelMin) SendMessage UDCtrl(0).h, %UDM_SETPOS, %False, UDctrl(0).value UDCtrl(0).Cptr = CODEPTR(Bom_UpDown0_Handler) ELSE Warning " needs U/D controller 0 for tempo adjustment.... Change *.ini, so that we have U/D controller 0 in the Cockpit!", 5000 END IF IF UDCtrl(3).h THEN UDCtrl(3).maxval = 4095 UDCtrl(3).minval = 0 UDCtrl(3).resetval = 2048 UDCtrl(3).value = 2048 UDCtrl(3).stap = 1 UDCtrl(3).hParent = gh.Cockpit UDCtrl(3).ID = %GMT_UPDOWN_ID + 3 ' now we have to send the messages... iSelMin = UDCtrl(3).minval iSelMax = UDCtrl(3).maxval SendMessage UDCtrl(3).h, %UDM_SETRANGE, %False, MakeLong(iSelMax, iSelMin) SendMessage UDCtrl(3).h, %UDM_SETPOS, %False, UDctrl(3).value UDCtrl(3).Cptr = CODEPTR(Bom_UpDown3_Handler) ELSE Warning " needs U/D controller 3 for tempo adjustment.... Change *.ini, so that we have U/D controller 3 in the Cockpit!", 5000 END IF IF UDCtrl(6).h THEN UDCtrl(6).maxval = 4095 UDCtrl(6).minval = 0 UDCtrl(6).resetval = 2048 UDCtrl(6).value = 2048 UDCtrl(6).stap = 1 UDCtrl(6).hParent = gh.Cockpit UDCtrl(6).ID = %GMT_UPDOWN_ID + 6 ' now we have to send the messages... iSelMin = UDCtrl(6).minval iSelMax = UDCtrl(6).maxval SendMessage UDCtrl(6).h, %UDM_SETRANGE, %False, MakeLong(iSelMax, iSelMin) SendMessage UDCtrl(6).h, %UDM_SETPOS, %False, UDctrl(6).resetval UDCtrl(6).Cptr = CODEPTR(Bom_UpDown6_Handler) ELSE Warning " needs U/D controller 6 for tempo adjustment.... Change *.ini, so that we have U/D controller 6 in the Cockpit!", 5000 END IF ' to clean up the cockpit, we conclude with deleting all up-down controllers that we do not need: ' Note that we have to do this indirectly, since performing the actual delete happens only after the ' final call to UpdateCockpit. FOR i = 0 TO UBOUND(UDCtrl) SELECT CASE i CASE 0, 3, 6 ' 0,3,6: these are the ones we need for tempo-controll. CASE ELSE UDCtrl(i).Cptr = %False ' this criterium will delete them... UDCtrl(i).hParent = %False END SELECT NEXT i END SUB SUB Bom_ReadIniFile (filenaam AS ASCIIZ) LOCAL k% LOCAL fnr AS LONG LOCAL aantal AS INTEGER 'LOCAL buffer AS OFSTRUCT LOCAL dummy$ LOCAL Subnum% LOCAL a$, b$ LOCAL Co% , cc% , c% LOCAL m AS ASCIIZ * 256 LOCAL szTitelbox AS ASCIIZ * 30 LOCAL mpName AS ASCIIZ * %MAX_COMPUTERNAME_LENGTH + 1 'constant not found in PB's winapi file...(added in gmt_kons) GetComputerName mpName,SIZEOF(mpName) ' WinApi function IF ISFALSE existfile (TRIM$(Filenaam)) THEN MSGBOX "Inifile for not found",,FUNCNAME$ : EXIT SUB ' here we read the BOM-ini file fnr = FREEFILE OPEN filenaam FOR INPUT LOCK SHARED AS #fnr DO UNTIL EOF(fnr) INPUT# fnr, dummy$ SELECT CASE TRIM$(UCASE$(dummy$)) CASE "SLIDERS" INPUT# fnr, aantal ' no longer used. App.NrSliders = aantal CASE "UDCONTROLLERS" INPUT# fnr, aantal App.NrUpDowns = aantal CASE "PATCH" INPUT# fnr, Bom.algo, Bom.Subpatch FOR k% = 0 TO 15 INPUT# fnr, Patch(Bom.algo, Bom.Subpatch, k%) NEXT k% CASE "DATA" INPUT# fnr, a$, Bom.algo, Subnum% FOR k% = 0 TO 15 INPUT# fnr, Notes(Bom.algo, Subnum%, k%) NEXT k% IF ISFALSE Subnum% THEN SELECT CASE Bom.algo CASE 1 TO 22 ' bug: before 29.10.2000 we had 0 to 22, including halt... ' bom algo's: 0= halt, 1= Open up to 22= Tempi Task(%BomBaseTask - 1 + Bom.algo).naam = MCASE$(a$) ' labels in Cockpit CASE 23 TO 38 ' songbook algo's: 23= intro up to 38= free Task(%SongBookBaseTask + Bom.algo - 23).naam = MCASE$(a$) END SELECT END IF 'CASE "[HARDWARE]" CASE "II_BOARD" DO INPUT# fnr, a$, b$ ' computername , board-name a$=UCASE$(TRIM$(a$)) b$=UCASE$(TRIM$(b$)) IF a$ = UCASE$(TRIM$(mpname)) THEN SELECT CASE b$ CASE "ANACOMP" ' 1993 Bom.hardware = %Anacomp '0 CASE "DIANA" ' 1996 Bom.hardware = %Diana '1 CASE "II_2000" ' 2000 = Anakomiel Bom.hardware = %ii_2000 '2 CASE "II_2001" ' 2001 Bom.hardware = %ii_2000 + 1 END SELECT EXIT DO END IF LOOP UNTIL a$ = "[HARDWARE_END]" CASE "HARMONIZER" INPUT# fnr, Songbook.Harmonizer, Songbook.HarChannel 'CoCoc% = 176 + Songbook.HarChannel 'cont.controller status byte Shared! 'vervangen door ModeMess Songbook.HarChannel,.... CASE "PITCH2MIDI" INPUT# fnr, Songbook.Pitch2Midi, Songbook.P2MChannel InitP2M TRIM$(Songbook.Pitch2Midi), Songbook.P2MChannel SetMidiListenChannel Songbook.P2MChannel, %True ' new 05.04.2003... ' no longer required since this is taken care of in InitP2M CASE "CONTROLLERS" DO DO INPUT# fnr, a$ LOOP UNTIL a$ = "CC" INPUT# fnr, Bom.algo DO co% = cc% INPUT# fnr, cc%, CcH(Bom.algo, cc%) IF cc% - co% > 1 THEN c% = co% + 1 DO CcH(Bom.algo, c%) = -1 INCR c% LOOP UNTIL c% = cc% END IF LOOP UNTIL cc% = 127 LOOP UNTIL Bom.algo = 38 END SELECT LOOP CLOSE #fnr END SUB SUB ProtPat () EXPORT LOCAL kanaal AS WORD LOCAL lpatch AS WORD ' LOCAL m AS STRING *50 ' translated from Book of Moves code ' input variabelen in BOM: Patch(Bom.algo,Bom.Subpatch,kanaal) ' m = "algo=" & STR$(Bom.algo) & " patches: " FOR kanaal = 0 TO 15 lpatch = Patch(Bom.algo, Bom.Subpatch, kanaal) #IF %DEF(%II_Mim) IF lpatch < 128 THEN ProgChange kanaal, lpatch #ELSE Proteuspatch Meq(0), kanaal, lpatch ' m = m & STR$(lpatch) & " " #ENDIF SLEEP 1 ' pacing!!! NEXT kanaal FOR kanaal= 0 TO 15 ModeMess kanaal, &H79, 0 ' reset all controllers Bend kanaal , 0, 64 ' pitch-wheel controller ModeMess kanaal, 7, &H7F ' kanaal-volume SLEEP 1 NEXT kanaal ' panning: ModeMess 0,10,0 ModeMess 1,10,64 ModeMess 2,10,127 ModeMess 3,10,20 ModeMess 4,10,64 ModeMess 5,10,107 ModeMess 6,10,47 ModeMess 7,10,80 ModeMess 8,10,58 ModeMess 9,10,70 ModeMess 10,10,52 ModeMess 11,10,76 ModeMess 12,10,46 ModeMess 13,10,82 ' ModeMess 14,10,127 ' ModeMess 15,10,20 END SUB SUB Halt () EXPORT ' disables all other composition/tasks ' this is activated via its codepointer in the cockpit buttons. LOCAL i AS LONG LOCAL m AS ASCIIZ * 15 LOCAL cptr AS DWORD FOR i = %BomBaseTask TO UBOUND(Task) IF BIT(Task(i).swit,%TASK_ONOFF) THEN StopTask i Task(i).tog = %False NEXT i IF BIT(Task(%Bom_PitchbendTask).swit,%TASK_ONOFF) THEN StopTask %Bom_PitchbendTask IF BIT(Task(%RiVox_0).swit,%TASK_ONOFF) THEN StopTask %RiVox_0 IF BIT(Task(%RiVox_1).swit,%TASK_ONOFF) THEN StopTask %RiVox_1 IF BIT(Task(%RiVox_2).swit,%TASK_ONOFF) THEN StopTask %RiVox_2 IF BIT(Task(%RiVox_3).swit,%TASK_ONOFF) THEN StopTask %RiVox_3 IF BIT(Task(%RiVox_4).swit,%TASK_ONOFF) THEN StopTask %RiVox_4 IF BIT(Task(%RiVox_5).swit,%TASK_ONOFF) THEN StopTask %RiVox_5 'reset toggling buttons: ' tog button: ButnSW(2).flag = %False Bom.tog = %False SetDlgItemText ButnSW(2).hParent, ButnSW(2).ID, ButnSW(2).tag0 ' sustain button: ButnSW(3).flag = %False Bom.sustain = %False SetDlgItemText ButnSW(3).hParent, ButnSW(3).ID, ButnSW(3).tag0 ' fade button (o.a. voor Shaman) Bom.fade = %False ButnSW(11).flag = %False SetDlgItemText ButnSW(11).hParent, ButnSW(11).ID, ButnSW(11).tag0 Bom.mapping = %False SELECT CASE Bom.algo CASE 1 TO 22 Task(Bom.algo + %BomBaseTask -1).tog = %False CASE 23 TO 38 Task(Bom.algo - 23 + %SongBookBaseTask).tog = %False END SELECT Bom.algo = %False Bom.Subpatch = %False @sr.noise = %False @sr.aScale = 1! UpdateMonitor 'Display 0,0,0,0 ' cptr = GetProcAddress(gh.gnh, "LEDDISPLAY") ' CALL DWORD cptr USING LedDisplay(0, 0, 0, 0) ' new 2014: Controller mDisp_A.channel, 123, 0 m = "" SetDlgItemText gh.Cockpit, %GMT_MSG1, m m = "" SetDlgItemText gh.Cockpit, %GMT_MSG2, m ' new 23.10.2003: ' reset setting for integration in the sonar_daq task: @sr.dta = 2 ' integration for amplitudes END SUB SUB Ouverture () EXPORT ' '27.12.2014: a recoding for Hybr is available now. We didn't implement this code on any ' earlier robot, as only Hybr is capable of dealing with the wide dynamic range ' required here. STATIC c% STATIC jl% STATIC cnt% STATIC Jumpval AS BYTE STATIC n%, k% LOCAL t AS LONG IF ISFALSE Task(%Open).tog THEN Task(%Open).tog = %True Task(%Open).channel = 0 jl% = 127 cnt% = %False Bom.algo = 1 n% = %False k% = %False Jumpval = %False @sr.noise = 4 App.tempo = 100 Task(%Open).freq = App.tempo / 60! MakeTaskUnique %Open END IF SELECT CASE Jumpval CASE 3 mPlay 10, n%, jl%/4 Task(%Open).freq = (App.tempo * 5)/ 60 Jumpval = %False EXIT SUB CASE 2 IF cnt% < 7 THEN mPlay 9,n%, jl%/3 Task(%Open).freq = (App.tempo *5)/ 60 ELSE mPlay 9, n%, jl% /4 Task(%Open).freq =(App.tempo * 4) / 60 END IF Jumpval = 3 EXIT SUB CASE 1 IF cnt% < 7 THEN mPlay 8,n%,jl%/2 Task(%Open).freq = (App.tempo * 5) / 60 ELSE mPlay 8, n%, jl%/3 Task(%Open).freq = (App.tempo * 4) / 60 END IF Jumpval = 2 EXIT SUB CASE %False t = @sr.xyza SHIFT RIGHT t,5 IF t < @sr.noise THEN ' speel het akkoord zolang geen beweging gedetekteerd wordt... FOR k% = 0 TO 7 ModeMess Task(%Open).channel + k%,10,INT(RND(1)*127) 'panning mPlay Task(%Open).channel + k%, Notes(Bom.algo,0,k%), jl% 'chord NEXT k% SELECT CASE cnt% CASE < 7 n% = Notes(Bom.algo, 0, RND(1) * 7) Task(%Open).freq = (App.tempo/0.4)/ 60 Jumpval = 1 EXIT SUB CASE > 6 n% = Notes(Bom.algo, 0, 7 + (RND(1) * 8)) Task(%Open).freq = (App.tempo*2) / 60 Jumpval = 1 EXIT SUB END SELECT Task(%Open).freq = App.tempo / 60! Jumpval = %False EXIT SUB ELSE INCR cnt% ' lus-teller ' stilte en diminuendo... jl% = jl% - 3 IF jl% <= 0 THEN jl% = 0 Bom.algo = 0 ' reset, so we can reset this piece... @sr.noise = %False Task(%Open).tog = %False StopTask %Open EXIT SUB END IF INCR @sr.noise ' - effort increases ' here we need to set the slider accordingly: t = TaskEX(%Sonar_Control_Task).SliderNumbers(0) SendMessage Slider(t).h, %TBM_SETPOS,%True, @sr.noise Task(%Open).freq = (App.tempo* 0.5) / 60! Jumpval = %False EXIT SUB END IF END SELECT END SUB SUB Topoi () EXPORT STATIC xh%,yh%,zh% STATIC no() AS BYTE STATIC oldtopo AS BYTE LOCAL volume AS WORD LOCAL xa%,ya%,za% LOCAL sig! LOCAL kanaal AS LONG LOCAL av AS LONG LOCAL cptr AS DWORD STATIC smallmovesilence AS DWORD IF ISFALSE Task(%Topoi).tog THEN Bom.mapping=0 Bom.algo = 2 @sr.noise = 1 '%False Bom.tog = %False Task(%Topoi).tog = %True REDIM no(0 TO 15) AS STATIC BYTE App.tempo = 400 Task(%Topoi).freq = App.tempo / 60! @sr.ascale = 1! ' changed to 1, 02.11.2003, make it less nervous. 2! 'new 01.11.2003 @sr.dta = 4 smallmovesilence = %False MakeTaskUnique %Topoi END IF IF Bom.tog THEN 'Bom.Mapping = Place ' use the new function returning a number 0-14 ' or, else the function Topo%(0) or Topo%(4) CALL DWORD cpPlace USING Place TO Bom.mapping ELSE 'Bom.Mapping = Topo(0) ' default at start up CALL DWORD cpTopo USING Topo(0) TO Bom.mapping END IF Task(%Topoi).freq = App.tempo / 60! ' notes 0ff on small movement code: IF Bom.Mapping = oldtopo THEN ' did'nt work anymore because we did not set oldtopo = Bom.mapping ... ' window for small movement: IF ISFALSE smallmovesilence THEN IF @sr.xyza > (32 + (@sr.noise * 32)) THEN ' trigval to be experimentally tested. ' 32 equals 1 bit if we have 7 bit resolution. (VU display shows 8 bit) 'IF @sr.xyza < (@sr.noise * 512) THEN FOR kanaal = 0 TO 15 IF no(kanaal) THEN NoteOff Task(%Topoi).channel + kanaal, no(kanaal) no(kanaal) = %False END IF NEXT kanaal smallmovesilence = %True Task(%Topoi).freq = Task(%Topoi).freq / 4 ' EXIT SUB 'ELSE ' smallmovesilence = %False END IF END IF EXIT SUB ELSE smallmovesilence = %False END IF ' --------------------------------- volume = @sr.xyza '@sr.amp - does not work!!! SHIFT RIGHT volume, 5 ' 0-127 FOR kanaal = 0 TO 7 n(kanaal) = Notes(Bom.algo, Bom.mapping, kanaal) IF n(kanaal) THEN n(kanaal) = n(kanaal) + 36 + (12 * (volume / 36)) ELSE IF Bom.mapping > 8 THEN SELECT CASE kanaal CASE 0 xa% = @sr.xac /64 '-32 to + 31 IF xa% > 15 THEN xa% = 15 IF xa% < -16 THEN xa% = -16 ' new: 'av = AvgStatArr (DataBuf0(), sig!, 8) 'SHIFT RIGHT av,8 ' better?: av = @sr.xa SHIFT RIGHT av,8 n(kanaal) = (av * 7) + xa% CASE 1 ya% = @sr.yac / 64 IF ya% > 15 THEN ya% = 15 IF ya% < -16 THEN ya% = -16 ' new: 'av = AvgStatArr (DataBuf1(), sig!, 8) av = @sr.ya SHIFT RIGHT av,8 n(kanaal) = (av * 7) + ya% CASE 2 za% = @sr.zac / 64 IF za% > 15 THEN za% = 15 IF za% < -16 THEN za% = -16 ' new: 'av = AvgStatArr (DataBuf2(), sig!, 8) av = @sr.za SHIFT RIGHT av,8 n(kanaal) = (av * 7) + za% END SELECT END IF END IF IF n(kanaal) < 36 THEN n(kanaal) = %False: v(kanaal) = %False IF n(kanaal) <> no(kanaal) THEN IF no(kanaal) > %False THEN ' here we can try to let notes hang... IF ISFALSE n(kanaal) THEN 'ISFALSE volume THEN 'OR ISFALSE n(kanaal) THEN ' laat noten hangen ELSE NoteOff Task(%Topoi).channel + kanaal, no(kanaal) no(kanaal) = %False END IF END IF IF n(kanaal)> %False THEN IF volume > %False THEN mPlay Task(%Topoi).channel + kanaal, n(kanaal), volume no(kanaal) = n(kanaal) END IF END IF END IF NEXT kanaal oldtopo = Bom.mapping ' we forgot this one in versions before 02.11.2003... END SUB SUB Minor () EXPORT LOCAL faktor AS SINGLE LOCAL t AS LONG IF Task(%Minor).tog = %False THEN Task(%Minor).tog = %True Task(%Minor).channel = %False Bom.algo = 3 Bom.mapping = %False Bom.Subpatch = %False @sr.noise = 3 App.tempo = 144 Task(%Minor).freq = App.tempo / 60! ' controls: mapping MakeTaskUnique %Minor END IF DIM AD(0 TO 15) AS LOCAL INTEGER ' 04.11.2003: we changed the scaling for @sr.xe,ye,ze,xyze ' to be compatible again with the former code, we ' should now square the e-values and divide by %d12. IF (@sr.xyze^2)/%d12 =< @sr.noise THEN Task(%Minor).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = @sr.xyzf SHIFT RIGHT AD(7), 9 ' 0-7 AD(7) = 36 + (12* AD(7)) ' oktaafligging IF AD(7) > 84 THEN AD(7) = 84 ' was 72 before 01.11.2003 DIM ADL(0 TO 15) AS LOCAL INTEGER 'IF (@sr.xe^2)/%d12 > %False THEN ADL(8) = INT(15.268 * LOG(@sr.xe)) ELSE ADL(8)=%False 'IF (@sr.ye^2)/%d12 > %False THEN ADL(9) = INT(15.268 * LOG(@sr.ye)) ELSE ADL(9)=%False 'IF (@sr.ze^2)/%d12 > %False THEN ADL(10) = INT(15.268 * LOG(@sr.ze)) ELSE ADL(10)=%False ' new : try this: IF (@sr.xe^2)/%d12 > %False THEN ADL(8)=@sr.xe / 64 ELSE ADL(8)=%False IF (@sr.ye^2)/%d12 > %False THEN ADL(9)=@sr.ye / 64 ELSE ADL(9)=%False IF (@sr.ze^2)/%d12 > %False THEN ADL(10)=@sr.ze / 64 ELSE ADL(10)=%False IF @sr.xyza > %False THEN ADL(3) = INT(15.268 * LOG(@sr.xyza)) ELSE ADL(3)=%False IF @sr.xf > %False THEN ADL(4) = INT(15.268 * LOG(@sr.xf)) ELSE ADL(4)=%False IF @sr.yf > %False THEN ADL(5) = INT(15.268 * LOG(@sr.yf)) ELSE ADL(5)=%False IF @sr.zf > %False THEN ADL(6) = INT(15.268 * LOG(@sr.zf)) ELSE ADL(6)=%False IF @sr.xyzac <> %False THEN ADL(15) = INT((15.268 * LOG(ABS(@sr.xyzac))) * SGN(@sr.xyzac)) ' to be checked for range !!! ELSE ADL(15)= %False END IF IF ADL(8) THEN SHIFT RIGHT ADL(4),3 mPlay Task(%Minor).channel ,AD(7) + Notes(Bom.algo, Bom.mapping, ADL(4)), ADL(8) END IF IF ADL(10) THEN SHIFT RIGHT ADL(6),3 mPlay Task(%Minor).channel+ 1, AD(7) + Notes(Bom.algo, Bom.mapping, ADL(6)),ADL(10) END IF IF ADL(9) THEN SHIFT RIGHT ADL(5),3 mPlay Task(%Minor).channel + 2, AD(7) + Notes(Bom.algo, Bom.mapping, ADL(5)),ADL(9) END IF IF (ADL(6) > 4) AND ((ADL(4) AND ADL(5)) = ADL(6)) THEN mPlay Task(%Minor).channel + 7, AD(7), ADL(3) \ 2 EXIT SUB END IF IF ADL(5) = ADL(6) THEN mPlay Task(%Minor).channel + 3, AD(7) + 12, ADL(3)\2 mPlay Task(%Minor).channel + 6, AD(7) - 12, ADL(3)\2 END IF IF ADL(4) = ADL(5) THEN mPlay Task(%Minor).channel + 4, AD(7) + 7, ADL(3) \ 2 IF ADL(4) = ADL(6) THEN mPlay Task(%Minor).channel + 5, AD(7) - 7, ADL(3) \ 2 SELECT CASE ABS(ADL(15)) '(LogAD%(15)) ' 0 - 64 CASE > 50 faktor = 2 CASE < 10 faktor = 0.5 CASE ELSE faktor = 1 END SELECT Task(%Minor).freq = (App.tempo * faktor) / 60! END SUB SUB Beat () STATIC Jumpval AS BYTE STATIC l% STATIC AD() AS INTEGER IF Task(%Beat).tog = %False THEN Task(%Beat).tog = %True @sr.noise = 1 REDIM AD(0 TO 15) AS STATIC INTEGER App.tempo = 240 Bom.algo = 4 Jumpval = %False @sr.ascale = 6! @sr.dta = 12 MakeTaskUnique %Beat Task(%Beat).freq = App.tempo / 60! END IF SELECT CASE Jumpval CASE %False AD(11) = (@sr.xyze ^2)/ %d12 ' rescaled according to DAQ changes. SHIFT RIGHT AD(11),5 IF AD(11) < @sr.noise THEN Task(%Beat).freq = 25 ' new, added 04.11.2003 for fast response EXIT SUB END IF AD(0) = @sr.xa SHIFT RIGHT AD(0), 5 AD(7) = @sr.xyzf SHIFT RIGHT AD(7),9 ' 3 bits; 0-7 - velocity INCR AD(7) ' 1 - 8 - bepalend voor tempo. AD(12) = @sr.xac \ 32 ' -64 -> + 63 Jumpval = 1 IF (ABS(AD(12)) > @sr.noise) AND (AD(0) > @sr.noise + @sr.noise + 1) THEN n(0) = 64 + AD(12) v(0) = AD(0) IF v(0) > %False THEN mPlay Task(%Beat).channel,n(0), v(0) Task(%Beat).freq = (App.tempo * AD(7))/60! ' 4Hz to 32Hz, if app.tempo=240 END IF EXIT SUB CASE 1 AD(1) = @sr.ya SHIFT RIGHT AD(1),5 '0-127 IF AD(1) > 127 THEN AD(1) = 127 AD(13) = @sr.yac \ 32 Jumpval = 2 IF ABS(AD(13)) > @sr.noise AND (AD(1) > @sr.noise + @sr.noise + 1) THEN n(1) = 64 + AD(13) v(1) = AD(1) IF v(1) THEN mPlay Task(%Beat).channel + 2, n(1) , v(1) Task(%Beat).freq = (App.tempo * AD(7))/ 60! END IF EXIT SUB CASE 2 AD(2) = @sr.za SHIFT RIGHT AD(2),5 '0-127 IF AD(2) > 127 THEN AD(2) = 127 AD(14) = @sr.zac \ 32 Jumpval = 3 IF (ABS(AD(14)) > @sr.noise) AND (AD(2) > @sr.noise + @sr.noise + 1) THEN n(2) = 64 + AD(14) v(2) = AD(2) IF v(2) THEN mPlay Task(%Beat).channel + 1, n(2), v(2) Task(%Beat).freq = (App.tempo * AD(7))/ 60! END IF EXIT SUB CASE 3 Jumpval = %False AD(3) = @sr.xyza l% = @sr.xyzf IF (AD(3) > 1152) AND (l% > 2880) THEN '36*32 en 90*32 THEN SHIFT RIGHT l%,5 ' 7 bits n(6) = l% l% = AD(3) SHIFT RIGHT l%,5 ' 7 bits v(6) = l% OR 64 mPlay Task(%Beat).channel + 6, n(6), v(6) EXIT SUB END IF AD(0) = @sr.xa SHIFT RIGHT AD(0),6 AD(1) = @sr.ya SHIFT RIGHT AD(1),6 ' 0-63 AD(2) = @sr.za SHIFT RIGHT AD(2),6 IF (AD(0) > 16) AND (AD(1) > 16) THEN 'n(3) = INT(15.268 * LOG(@sr.xe)) 'LogAD%(8) n(3) = @sr.xe / 32 ' 0-127 new 04.11.2003 IF v(0) THEN mPlay Task(%Beat).channel + 3, n(3) , v(0) 'AD(0) 'n(4) = INT(15.268 * LOG(@sr.ye)) 'LogAD%(9) n(4) = @sr.ye / 32 IF v(1) THEN mPlay Task(%Beat).channel + 4, n(4) , v(1) 'AD(1) ELSEIF (AD(0) > 16) AND (AD(2) > 16) THEN 'n(3) = INT(15.268 * LOG(@sr.xe)) 'LogAD%(8) n(3) = @sr.xe / 32 IF v(0) THEN mPlay Task(%Beat).channel + 3, n(3), v(0) 'AD(0) 'n(5) = INT(15.268 * LOG(@sr.ze)) 'LogAD%(10) n(5) = @sr.ze / 32 IF v(2) THEN mPlay Task(%Beat).channel + 5, n(5), v(2) 'AD(2) ELSEIF (AD(1) > 16) AND (AD(2) > 16) THEN 'n(4) = INT(15.268 * LOG(@sr.ye)) 'LogAD%(9) n(4) = @sr.ye / 32 IF v(1) THEN mPlay Task(%Beat).channel + 4, n(4), v(1) 'AD(1) 'n(5) = INT(15.268 * LOG(@sr.ze)) 'LogAD%(10) n(5) = @sr.ze / 32 IF v(2) THEN mPlay Task(%Beat).channel + 5, n(5), v(2) 'AD(2) END IF IF (AD(0) + AD(1) + AD(2)) > 120 THEN l% = @sr.xyza SHIFT RIGHT l%,5 n(7)= l% mPlay Task(%Beat).channel + 7, n(7), &H7F Task(%Beat).freq = (App.tempo * AD(7))/ (60! * 2) EXIT SUB END IF ModeMess Task(%Beat).channel + 4, &H7B, %False ModeMess Task(%Beat).channel + 5, &H7B, %False ModeMess Task(%Beat).channel + 6, &H7B, %False END SELECT Task(%Beat).freq = App.tempo/ 60! ' 16 Hz END SUB SUB Rising () EXPORT STATIC jl% 'il% STATIC JumpVal AS BYTE STATIC tBend AS DWORD STATIC no() AS BYTE LOCAL m% STATIC oldmap AS BYTE LOCAL PitchBend AS LONG LOCAL cptr AS DWORD IF ISFALSE Task(%Rising).tog THEN Task(%Rising).tog = %True Task(%Rising).channel = 0 Bom.algo = 5 @sr.noise = 2 ' 1 App.tempo = 300 Task(%Rising).freq = App.tempo / 60! jl% = 0 ' for resetability... JumpVal = %False REDIM no(0 TO 7) AS STATIC BYTE @sr.ascale = 16! MakeTaskUnique %Rising END IF DIM AD(0 TO 15) AS LOCAL INTEGER SELECT CASE JumpVal CASE %False ' de bewegingsgevoeligheid ligt in @sr.noise AD(3) = @sr.xyza SHIFT RIGHT AD(3),5 IF AD(3) < @sr.noise THEN Task(%Rising).freq = DAQparams.scanfreq / 2 oldmap = %False EXIT SUB END IF Task(%Rising).freq = App.tempo / 60! IF ISFALSE Bom.tog THEN 'bom.mapping = Topo(4) ' new 23.08.1999 CALL DWORD cpTopo USING Topo(4) TO bom.mapping ELSE 'bom.mapping = Place CALL DWORD cpPlace USING Place TO Bom.mapping END IF IF bom.mapping > 7 THEN bom.mapping = bom.mapping - 6 ' cfr. lookup & topo function. SELECT CASE bom.mapping CASE Oldmap EXIT SUB CASE 0 EXIT SUB CASE 1 ' central position. AD(7) = MAX(@sr.xf, @sr.yf,@sr.zf,@sr.xyzf) SHIFT RIGHT AD(7),5 ' 0-127 jl% = jl% + 1 + (AD(7) \ %Rising_Intervalsize) IF jl% > %Rising_Endvalue THEN jl% = %Rising_Endvalue Jumpval = 2 SetDlgItemText gh.Cockpit, %GMT_MSG2, STR$(jl%) & "/" & STR$(%Rising_Endvalue) Oldmap= Bom.mapping EXIT SUB CASE 2 TO 3 ' vertical velocity is maximal. ' 2 = z > (x = y) ' 3 = z > x > y INCR jl% SetDlgItemText gh.Cockpit, %GMT_MSG2, STR$(jl%) & "/" & STR$(%Rising_Endvalue) Jumpval = 2 Oldmap= Bom.mapping EXIT SUB CASE 4 TO 7 Jumpval = 2 Oldmap = Bom.mapping EXIT SUB CASE ELSE Jumpval = %False Oldmap = Bom.mapping EXIT SUB END SELECT CASE 2 ' mPlay the notes from the lookup mapping AD(3) = @sr.xyza SHIFT RIGHT AD(3),6 ' 0-63 - for volume FOR m% = 0 TO 7 n(m%) = Notes(Bom.algo, bom.mapping -1, m%) ' the -1 is correct! (was bug in bom96) IF ISFALSE n(m%) THEN v(m%) = %False ELSE n(m%) = n(m%) + 36 + jl% v(m%) = 63 + AD(3) IF n(m%) > 127 THEN n(m%) = 127 IF n(m%) AND (n(m%) <> no(m%)) THEN IF no(m%) THEN NoteOff Task(%Rising).channel + m%, no(m%) DelNote2Har Task(%Rising).Har, INT (no(m%)) no(m%) = %False END IF IF v(m%) THEN mPlay Task(%Rising).channel + m%, n(m%), v(m%) AddNote2Har Task(%Rising).Har, INT(n(m%)), INT(v(m%)) no(m%)= n(m%) END IF END IF END IF 'no(m%) = n(m%) NEXT m% Jumpval = 3 EXIT SUB CASE 3 'startglistask: IF ISFALSE BIT(Task(%Bom_PitchbendTask).swit,%TASK_ONOFF) THEN AD(3) = @sr.xyza SHIFT RIGHT AD(3), 2 ' 0-1023 tbend = timeGetTime + (1024 - AD(3)) Task(%Bom_PitchbendTask).duur = tbend ' in ms Task(%Bom_PitchbendTask).channel = Task(%Rising).channel Task(%Bom_PitchbendTask).freq = 21 StartTask %Bom_PitchbendTask ' stops itself when its duration is over. END IF JumpVal = %False END SELECT IF jl% >= %Rising_Endvalue THEN Task(%Rising).tog = %False Task(%Rising).duur = %False StopTask %Rising END IF END SUB SUB Sforte () EXPORT DIM AD(0 TO 6) AS LOCAL INTEGER ' werkt perfekt. IF Task(%Sforte).tog = %False THEN Task(%Sforte).tog = %True Bom.algo=6 @sr.noise= 3 '2 Bom.Subpatch = 0 Bom.mapping = 0 Task(%Sforte).freq = 6.666 App.tempo = 400 Task(%Sforte).channel = 0 MakeTaskUnique %Sforte END IF AD(0) = @sr.xa SHIFT RIGHT AD(0), 5 ' res 7 AD(1) = @sr.ya SHIFT RIGHT AD(1), 5 AD(2) = @sr.za SHIFT RIGHT AD(2), 5 AD(3) = @sr.xyza SHIFT RIGHT AD(3), 4 ' makes it 8 bits IF AD(3) > 64 THEN AD(3)= 127 IF AD(3) < @sr.noise THEN EXIT SUB AD(4)= @sr.xf SHIFT RIGHT AD(4), 7 ' 5 bit AD(5) = @sr.yf SHIFT RIGHT AD(5), 7 AD(6) = @sr.zf SHIFT RIGHT AD(6), 7 IF AD(0) > %False THEN mPlay Task(%Sforte).channel + 0, 64 + AD(4), AD(3) mPlay Task(%Sforte).channel + 5 , 64 - AD(4), AD(3) END IF IF AD(1) > %False THEN mPlay Task(%Sforte).channel + 2, 64 + AD(5), AD(3) mPlay Task(%Sforte).channel + 7, 64 - AD(5), AD(3) END IF IF AD(2) > %False THEN mPlay Task(%Sforte).channel + 1, 64 + AD(6), AD(3) mPlay Task(%Sforte).channel + 6, 64 - AD(6), AD(3) END IF IF (AD(3) > 48) AND ISFALSE (AD(0) + AD(1) + AD(2)) THEN mPlay Task(%Sforte).channel + 3, 64, 120 ' dT funktie END IF IF AD(0) + AD(1) + AD(2) > 64 THEN mPlay Task(%Sforte).channel + 4, 40, AD(3) END IF END SUB SUB Lead () EXPORT STATIC JumpVal AS BYTE STATIC LeadDone AS BYTE STATIC tl AS DWORD LOCAL kanaal AS BYTE LOCAL volume AS WORD LOCAL m AS ASCIIZ * 30 IF Task(%Lead).tog = %False THEN Task(%Lead).tog = %True Bom.algo=7 @sr.noise = 12 Bom.tog = %False Bom.sustain = %False ' 'Sustain (^) = mPlay final chord' LeadDone= %False App.tempo = 300 Task(%Lead).freq = App.tempo / 60! Jumpval = %False MakeTaskUnique %Lead m = "Sustain button for final chord" SetDlgItemText gh.Cockpit,%GMT_MSG2, m ' komt onder de groupbox Awaiting / Expecting END IF IF Bom.sustain THEN IF ISFALSE Leaddone THEN m = "final chord in lead..." SetDlgItemText gh.Cockpit,%GMT_MSG2, m Leaddone = %True Jumpval = 1 END IF END IF SELECT CASE JumpVal CASE 0 ' eigenlijke lead-kode: DIM AD(0 TO 7) AS LOCAL INTEGER AD(0) = @sr.xa SHIFT RIGHT AD(0),5 AD(1) = @sr.ya SHIFT RIGHT AD(1),5 AD(2) = @sr.za SHIFT RIGHT AD(2),5 AD(3) = @sr.xyza SHIFT RIGHT AD(3),8 ' 0-15 SHIFT LEFT AD(3),3 ' 0-120 AD(4) = @sr.xf SHIFT RIGHT AD(4),5 AD(5) = @sr.yf SHIFT RIGHT AD(5),5 AD(6) = @sr.zf SHIFT RIGHT AD(6),5 IF AD(4) + AD(5) + AD(6) < @sr.noise THEN EXIT SUB IF AD(0) THEN n(0) = AD(0) ' noten afhankelijk van amplitude! IF AD(1) THEN n(2) = AD(1) IF AD(2) THEN n(1) = AD(2) IF n(0) AND n(0) < 48 THEN n(0) = n(0) + 36 IF n(1) AND n(1) < 48 THEN n(1) = n(1) + 36 IF n(2) AND n(2) < 48 THEN n(2) = n(2) + 36 volume = SQR(@sr.xyza * @sr.xyzf) ' 0-4095 SHIFT RIGHT volume, 5 ' better curve , 11.08.1999 FOR kanaal = 0 TO 5 mPlay Task(%Lead).channel + kanaal, n(kanaal), volume NEXT kanaal n(3) = n(0) ' herhaal elke vorige noot bij elke volgende stap! n(4) = n(1) n(5) = n(2) Task(%Lead).freq = (App.tempo - (RND(1)*60)) / 60! ' exact omgerekend. EXIT SUB CASE 1 FOR kanaal = 0 TO 5 mPlay Task(%Lead).channel + kanaal,Notes(Bom.algo,2,kanaal), 127 NEXT kanaal tl = timeGetTime + 10000 Task(%Lead).freq = 17 JumpVal = 2 EXIT SUB CASE 2 'volume-kontrole slotakkoord: IF timeGetTime < tl THEN volume = SQR(@sr.xyza * @sr.xyzf) SHIFT RIGHT volume, 5 FOR kanaal = 0 TO 5 ModeMess Task(%Lead).channel + kanaal, 7, volume NEXT kanaal EXIT SUB ELSE Jumpval = 3 END IF CASE 3 Task(%Lead).tog = %False StopTask %Lead ' reset volume controller FOR kanaal = 0 TO 5 Modemess Task(%Lead).channel + kanaal, 7, 127 NEXT kanaal END SELECT END SUB SUB CANVAS () EXPORT STATIC Jumpval AS BYTE STATIC tc& LOCAL x AS INTEGER,y AS INTEGER ,z AS INTEGER ,xyz AS INTEGER LOCAL dummy AS INTEGER IF ISFALSE Task(%Canvas).tog THEN Task(%Canvas).tog = %True Task(%Canvas).channel = %False Bom.algo = 8 Bom.mapping = 0 Bom.subpatch = 0 Jumpval = %False App.tempo = 480 Task(%Canvas).freq = App.Tempo / 60! @sr.noise = 1 MakeTaskUnique %Canvas END IF DIM AD(0 TO 7) AS LOCAL INTEGER SELECT CASE Jumpval CASE %False AD(0) = @sr.xa AD(1) = @sr.ya AD(2) = @sr.za AD(3) = @sr.xyza AD(4) = @sr.xf AD(5) = @sr.yf AD(6) = @sr.zf FOR dummy = 0 TO 6 SHIFT RIGHT AD(dummy),5 NEXT dummy x = AD(0) IF x > 36 AND x < 96 THEN mPlay Task(%Canvas).channel, x + 30, 127 y = AD(1) IF y > 36 AND y < 96 THEN mPlay Task(%Canvas).channel + 2, y+30, 127 z = AD(2) IF z > 36 AND z < 96 THEN mPlay Task(%Canvas).channel + 1, z+30, 127 xyz = AD(3) IF x > 10 AND x < 36 THEN mPlay Task(%Canvas).channel + 3, x+36, xyz OR 64 IF x > 64 THEN mPlay Task(%Canvas).channel + 4 , x, 127 IF y > 64 THEN mPlay Task(%Canvas).channel + 5 , y , 127 IF y > 10 AND y < 36 THEN mPlay Task(%Canvas).channel + 6, y+36, xyz OR 64 IF z > 64 THEN mPlay Task(%Canvas).channel + 7 , z, 127 tc& = timeGetTime + (60000 / App.tempo) ' for tempo expressed in MM !!! Jumpval = %True Task(%Canvas).freq = 15 EXIT SUB CASE %True IF timeGetTime > tc& THEN Jumpval = %False Task(%Canvas).freq = 2 ELSE AD(0) = @sr.xa AD(1) = @sr.ya AD(2) = @sr.za AD(3) = @sr.xyza FOR dummy = 0 TO 3 SHIFT RIGHT AD(dummy), 5 ' make 7 bit NEXT dummy Bend Task(%Canvas).channel, 0, AD(0) Bend Task(%Canvas).channel + 2, 0, AD(1) Bend Task(%Canvas).channel + 1, 0, AD(2) Bend Task(%Canvas).channel + 4, 0, AD(0) Bend Task(%Canvas).channel + 5, 0, AD(1) IF AD(3) < @sr.noise THEN Jumpval = %False Task(%Canvas).freq = 2 END IF END IF END SELECT END SUB SUB Sluit () EXPORT STATIC ii% STATIC velcount AS BYTE STATIC Im% LOCAL il% LOCAL m AS ASCIIZ * 30 LOCAL amp AS WORD LOCAL timeframe AS WORD LOCAL NrSamp AS WORD LOCAL n AS WORD LOCAL t AS DWORD LOCAL cptr AS DWORD STATIC Jumpval AS BYTE IF Task(%Close).tog = %False THEN Task(%Close).tog = %True Task(%Close).channel = %False Bom.mapping = %False Bom.algo = 9 velcount = 127 Bom.Subpatch = %False FOR n = 0 TO 15 n(n) = Notes(Bom.algo, Bom.Subpatch, n) NEXT n Jumpval = %False ii% = 0 @sr.noise = 32 ' seems too high... 21.09.2003 remark App.tempo = 96 Task(%Close).freq = App.tempo / 60! @sr.ascale = 2! MakeTaskUnique %Close END IF amp = @sr.xyza SHIFT RIGHT amp,5 ' 0 - 127 IF amp < @sr.noise THEN EXIT SUB SELECT CASE Jumpval CASE %False FOR Im% = 0 TO 7 IF ii% < 3 THEN ' ii% is het aantal noten dat reeds 36 is... mPlay Task(%Close).channel + Im%, n(Im%), velcount OR 15 ELSE mPlay Task(%Close).channel + Im%, n(Im%),(2* EXP2(ii%))-1 ' ((2 * (ii% ^ 2)) - 1) END IF NEXT Im% n = @sr.xyzac IF n > %False THEN ' we reageren alleen op versnelling! n = n \ 32 IF n THEN INCR n 'was: 1 - 16 IF n > 16 THEN n = 16 ELSE n = %False END IF Task(%Close).freq = (app.tempo * ((16 -ii%)/ 8!) * ((n+ 16)/16!) )/ 60! DECR velcount IF velcount < 15 THEN velcount = 15 Gamble: Im% = RND(0,1023) AND 7 m = "Descending channel=" + STR$(Im%) SetDlgItemText gh.Cockpit,%GMT_MSG2, m IF (n(Im%) <= 36) THEN IF @sr.xyzf < @sr.noise * 21 THEN EXIT SUB ELSE ii% = %False FOR Im% = 0 TO 7 IF n(Im%)= 36 THEN INCR ii% NEXT Im% IF ii% < 8 THEN GOTO Gamble EXIT SUB ELSE ' in dit geval is het einde bereikt... Jumpval = %True il% =1 Task(%Close).freq = 4 EXIT SUB END IF END IF ' check this for bugs... ELSE ' de grootte van de dalingsintervallen hangt af van de globale bewegingssnelheid ' res% = 3 'n(Im%) = n(Im%) - (ADC%(7)\512) n = @sr.xyzf SHIFT RIGHT n, 9 ' 0-7 n(Im%) = n(Im%) - n IF n(Im%) < 36 THEN n(Im%) = 36 END IF ' tel het aantal noten dat al op 36 is aangekomen... ii% = %False FOR Im% = 0 TO 7 IF n(Im%) = 36 THEN INCR ii% NEXT Im% IF ii% < 8 THEN EXIT SUB ELSE ' in dit geval is het einde bereikt. Jumpval = %True il% =1 Task(%Close).freq = 4 EXIT SUB END IF CASE %True ' slot-unisono: FOR Im% = 0 TO 7 mPlay Task(%Close).channel + Im%, 36, 127 NEXT Im% mPlay Task(%Close).channel + 7 + il%, 24, 64 + (il% *16) INCR il% IF il% >= 4 THEN Task(%Close).freq = 0.1 Jumpval = 2 EXIT SUB ELSE EXIT SUB END IF CASE 2 m = "Final Unison reached ! " SetDlgItemText gh.Cockpit,%GMT_MSG2, m ' Silence Task(%Close).tog = %False StopTask %Close 'Display 0,0,0,0 'cptr = GetPRocAddress(gh.gnh, "LEDDISPLAY") ' cptr = GetProcAddress(gh.gnh, "LEDDISPLAY") ' corrected 06.06.2009 ' CALL DWORD cptr USING LedDisplay(0, 0, 0, 0) ' new 2014: Controller mDisp_A.channel, 123, %False END SELECT END SUB SUB Primetime () EXPORT 'UpDowns controll tempo. LOCAL oldtempo AS INTEGER LOCAL i AS LONG LOCAL AD() AS INTEGER IF Task(%Primetime).tog = %False THEN Task(%PrimeTime).tog = %True Bom.algo = 10 App.tempo = 240 Task(%Primetime).freq = App.tempo / 60 @sr.noise = 3 @sr.ascale = 2 MakeTaskUnique %PrimeTime Task(%Vox_0).freq = App.tempo / (60*2) StartTask %Vox_0 Task(%Vox_1).freq = App.tempo / (60*3) StartTask %Vox_1 Task(%Vox_2).freq = App.tempo / (60*5) StartTask %Vox_2 Task(%Vox_3).freq = App.tempo/ (60 *7) StartTask %Vox_3 Task(%Vox_4).freq = App.tempo / (60 * 11) StartTask %Vox_4 Task(%Vox_5).freq = App.tempo / (60 * 13) StartTask %Vox_5 Task(%Vox_6).freq = App.tempo / (60 * 17) StartTask %Vox_6 LOCAL m AS ASCIIZ * 26 m = "" SetDlgItemText gh.Cockpit, %GMT_MSG2, m END IF IF App.tempo <> oldtempo THEN ' here we have to recalculate the tempi for all playing tasks... Task(%Vox_0).freq = App.tempo / (60 * 2) Task(%Vox_1).freq = App.tempo / (60 * 3) Task(%Vox_2).freq = App.tempo / (60 * 5) Task(%Vox_3).freq = App.tempo/ (60 * 7) Task(%Vox_4).freq = App.tempo /(60 * 11) Task(%Vox_5).freq = App.tempo / (60 * 13) Task(%Vox_6).freq = App.tempo / (60 * 19) Task(%PrimeTime).freq = App.tempo / 60! oldtempo = App.tempo UpdateMonitor END IF DIM AD(0 TO 15) AS INTEGER AD(0) = @sr.xa AD(1) = @sr.ya AD(2) = @sr.za AD(3) = @sr.xyza AD(12) = @sr.xac AD(13) = @sr.yac AD(14) = @sr.zac AD(15) = @sr.xyzac FOR i = 0 TO 15 SELECT CASE i CASE 0,1,2 SHIFT RIGHT AD(i), 5 v(i) = AD(i) v(i+3) = AD(i) CASE 3 SHIFT RIGHT AD(i), 5 v(i+3) = AD(i) CASE 12, 13, 14 AD(i) = AD(i)\ 32 ' -64 -> + 63 IF AD(i) < -59 THEN AD(i) = -59 IF AD(i) > 59 THEN AD(i) = 59 n(i-12) = 60 + AD(i) n(i-9) = 60 - AD(i) CASE 15 AD(i) = AD(i) \ 32 IF AD(i) < -59 THEN AD(i) = -59 IF AD(i) > 59 THEN AD(i) = 59 n(i-9) = 60 + AD(i) END SELECT IF i < 6 THEN IF n(i) > 96 THEN n(i) = n(i) - 12 ': n(i) = n(i) AND 127 IF n(i) < 36 THEN n(i) = n(i) + 24 IF n(i) < 36 THEN n(i) = n(i) + 24 IF n(i) =< 0 THEN n(i) = 0 : v(i) = 0 IF v(i) < @sr.noise THEN v(i) = 0 END IF NEXT i END SUB SUB Roep () EXPORT ' this is CALL in the cockpit STATIC xh%, yh%, zh%, il% STATIC Jumpval AS BYTE LOCAL xf%, yf%, zf% LOCAL aks AS INTEGER IF Task(%Call).tog = %False THEN Task(%Call).tog = %True Bom.algo = 11 App.tempo = 720 ' this will set the tempo at the end of the accellerando...[12Hz] Task(%Call).freq = 0.3 ' ca. 3" at the start... @sr.noise = 1 Bom.Subpatch = %False Bom.mapping = %False Bom.tog = %False il% = 36 xh% = %False yh% = %False zh% = %False Task(%Call).channel = %False Jumpval = %False ' patch F1-F10 ' Tab = gong - now translated by a button, labeled in the cockpit @sr.ascale = 4 MakeTaskUnique %Call LOCAL m AS ASCIIZ * 26 m = "patch F1-F10 button=gong " SetDlgItemText gh.Cockpit, %GMT_MSG2, m ' komt onder de groupbox Awaiting / Expecting END IF SELECT CASE Jumpval CASE %False xf% = @sr.xf SHIFT RIGHT xf%,5 xf% = il% + (xf% / 3) IF xf% > 127 THEN xf% = 127 ' non positional amplitude v(0) = @sr.xe / 32 ' changed 04.11.2003 - works fine. tested. IF v(0) <= @sr.noise THEN v(0) = %False IF v(0) > 127 THEN v(0) = 127 IF xh% <> xf% THEN IF v(0) THEN mPlay Task(%Call).channel, xf%, v(0) ELSE IF xh% THEN NoteOff Task(%Call).channel, xh% :xh% = %False END IF END IF ' vectorial velocity y-channel yf% = @sr.yf SHIFT RIGHT yf%,5 yf% = il% + (yf% / 3) IF yf% > 127 THEN yf% = 127 ' non positional amplitude yz v(1) = @sr.ye/32 IF v(1) <= @sr.noise THEN v(1) = %False IF v(1) > 127 THEN v(1) = 127 IF yh% <> yf% THEN IF v(1) THEN mPlay Task(%Call).channel+ 2, yf%, v(1) ELSE IF yh% THEN NoteOff Task(%Call).channel + 2, yh%: yh%= %False END IF END IF ' vectorial velocity z-channel zf% = @sr.zf SHIFT RIGHT zf%,5 zf% = il% + (zf% /6) IF zf% > 127 THEN zf% = 127 ' non positional amplitude zx v(2) = @sr.ze / 32 IF v(2) <= @sr.noise THEN v(2) = %False IF v(2) > 127 THEN v(2) = 127 IF zh% <> zf% THEN IF v(2) THEN mPlay Task(%Call).channel + 1, zf%, v(2) ELSE IF zh% THEN NoteOff Task(%Call).channel +1, zh%: zh%=%False END IF END IF IF zh% THEN NoteOff Task(%Call).channel + 1, zh% IF yh% THEN NoteOff Task(%Call).channel + 2, yh% IF xh% THEN NoteOff Task(%Call).channel + 0, xh% xh% = xf% yh% = yf% zh% = zf% aks = 64 + (@sr.xyzac \ 32) IF (xh% = yh%) OR (yh% = zh%) THEN il% = aks ' non-positional peak acceleration IF il% > 84 THEN il% = 84 IF il% < 36 THEN il% = 36 ' om de accellerando te vertalen kunnen we best freq incrementeren... Task(%Call).freq = Task(%Call).freq + (Task(%Call).freq / 30) '(113 steps) IF Task(%Call).freq > App.tempo / 60! THEN Task(%Call).freq = App.tempo / 60! ' vertaald via button : IF Bom.Subpatch > 9 THEN Bom.Subpatch = 9 ' via function keys... IF Bom.Subpatch = 9 THEN aks = @sr.xyzf SHIFT RIGHT aks,5 IF ISFALSE aks THEN Jumpval = %True Task(%Call).freq = 1 END IF END IF CASE %True Task(%Call).freq = 0.5 NoteOff 4, 52 mPlay 4, 48, 127 INCR Jumpval EXIT SUB CASE 2 NoteOff 4, 48 StopTask %Call END SELECT END SUB SUB Spooky () EXPORT ' needs 3 other tasks to play!!! LOCAL il AS BYTE IF Task(%Spooky).tog = %False THEN Bom.algo = 12 @sr.noise= 4 App.tempo = 180 Task(%Spooky).freq = App.tempo / 60! Task(%Spooky).tog = %True Task(%Spooky).channel = %False MakeTaskUnique %Spooky ' cfr. primetime - start voiceplay tasks. Task(%Vox_0).channel = Task(%Spooky).channel Task(%Vox_0).freq = (5 * App.tempo) / 60! Task(%Vox_1).channel = Task(%Spooky).channel + 1 Task(%Vox_1).freq = (4 * App.tempo) / 60! Task(%Vox_2).channel = Task(%Spooky).channel + 2 Task(%Vox_2).freq = (3 * App.tempo) / 60! StartTask %Vox_0 StartTask %Vox_1 StartTask %Vox_2 END IF DIM AD(0 TO 6) AS LOCAL INTEGER AD(0) = @sr.xa AD(1) = @sr.ya AD(2) = @sr.za AD(3) = @sr.xyza AD(4) = @sr.xf AD(5) = @sr.yf AD(6) = @sr.zf FOR il = 0 TO 6 SHIFT RIGHT AD(il),5 NEXT il FOR il = 0 TO 2 n(il)= AD(il+4) v(il) = AD(il) IF v(il) THEN v(il) = v(il) OR 48 IF n(il) < @sr.noise THEN n(il) = %False v(il) = %False END IF NEXT il Task(%Spooky).freq = App.tempo/ 60! Task(%Vox_0).freq = App.tempo * 0.0833 ' 5/60 Task(%Vox_1).freq = App.tempo * 0.0666 ' 4/60 Task(%Vox_2).freq = App.tempo * 0.0500 ' 3/60 END SUB SUB RecPlay () EXPORT STATIC JumpVal AS BYTE STATIC il% STATIC ij% STATIC melodysize AS BYTE STATIC no() AS BYTE LOCAL sig! LOCAL xa%,ya%,za%,xyz% IF ISFALSE Task(%Recplay).tog THEN Bom.algo = 13 App.tempo = 240 Task(%Recplay).freq = App.tempo / 60! @sr.noise = 2 melodysize = 48 ' zou moeten 12 sekonden opleveren. il% = %False ij% = %False REDIM Sam(0 TO 3, 0 TO melodysize)AS STATIC INTEGER REDIM no(0 TO 15) Task(%Recplay).tog= %True Task(%Recplay).channel = %False Jumpval = 255 LOCAL m AS ASCIIZ * 45 MakeTaskUnique %Recplay END IF SELECT CASE JumpVal CASE 0 ' wait for recording movement trigger IF @sr.xyza < @sr.noise * 256 THEN ' @sr.noise was expressed as a 4 bit value Task(%Recplay).freq = 20 ELSE JumpVal = 1 END IF EXIT SUB CASE 1 ' signal start of recording m = "Recording..." + STR$(il%) SetDlgItemText gh.Cockpit,%GMT_MSG2, m Silence il% = %False mPlay Task(%Recplay).channel + 3, 84, 64 no(3) = 84 Jumpval = 2 Task(%Recplay).freq = App.tempo / 60! EXIT SUB CASE 2 ' this is the recording section: ' changed 31.10.2003 [ to be checked] xa% = @sr.xf \ 256 ' 0-15 ya% = @sr.yf \ 256 za% = @sr.zf \ 256 xyz% = @sr.xyzf \ 256 '----- IF ISFALSE xyz% THEN Sam(3,il%) = %False Sam(2,il%) = %False Sam(1, il%) = %False Sam(0, il%) = %False IF il% > melodysize /2 THEN JumpVal = 3 EXIT SUB END IF ELSE IF xa% THEN Sam(0,il%) = 48 + xa% IF ya% THEN Sam(1,il%) = 60 + ya% IF za% THEN Sam(2,il%) = 72 + za% SHIFT LEFT xyz%, 3 ' 0-120 Sam(3,il%) = xyz% ' level END IF INCR il% Task(%Recplay).freq = App.tempo / 60! IF il% > melodysize THEN il% = melodysize JumpVal = 3 EXIT SUB END IF EXIT SUB CASE 3 ' playback - cue signal: m = "Playback..." + STR$(il%) + "notes" SetDlgItemText gh.Cockpit,%GMT_MSG2, m mPlay Task(%Recplay).channel, 41, 110 no(3) = 41 Jumpval = 4 ij% = 0 ' reset playback note pointer Task(%Recplay).freq = App.tempo / 60! EXIT SUB CASE 4 Task(%Recplay).freq = App.tempo / 60! n(0) = Sam(0,ij%) n(1) = Sam(1,ij%) n(2) = Sam(2,ij%) v(0) = Sam(3,ij%) v(1) = v(0) v(2) = v(0) IF n(0) THEN mPlay Task(%Recplay).channel , n(0), v(0) no(0) = n(0) END IF IF n(1) THEN mPlay Task(%Recplay).channel+2, n(1), v(1) no(1) = n(1) END IF IF n(2) THEN mPlay Task(%Recplay).channel + 1, n(2), v(2) no(2) = n(2) END IF INCR ij% IF ij% > il% THEN ' start again... REDIM Sam(0 TO 3,0 TO melodysize) il% = %False ij% = %False JumpVal = 255 EXIT SUB END IF Task(%Recplay).freq = App.tempo / 60! CASE 255 ' cue for movement trigger m = "Waiting..." SetDlgItemText gh.Cockpit,%GMT_MSG2, m ' low-gong: mPlay Task(%Recplay).channel + 3, 30, 120 ' was noot 36 no(3) = 36 JumpVal = 0 Task(%Recplay).freq = 16 EXIT SUB END SELECT END SUB SUB Locked () ' now only performs Lock. Unlock moved to task UnLocked IF ISFALSE Task(%Lock).tog THEN Bom.algo = 14 App.tempo = 60 @sr.noise = 2 Task(%Lock).tog= %True Task(%Lock).channel = %False Task(%Lock).freq = App.tempo / 60! @sr.ascale = 2! MakeTaskUnique %Lock n(6) = 10 v(6) = 127 Task(%Vox_0).freq = 3.0 Task(%Vox_1).freq = 3.1 Task(%Vox_2).freq = 3.2 Task(%Vox_3).freq = 3.3 Task(%Vox_4).freq = 3.4 Task(%Vox_5).freq = 3.5 Task(%Vox_6).freq = 0.3 StartTask %Vox_0 StartTask %Vox_1 StartTask %Vox_2 StartTask %Vox_3 StartTask %Vox_4 StartTask %Vox_5 StartTask %Vox_6 Bom.Subpatch = 0 ProtPat Task(%Lock).freq = App.tempo/ 60! END IF DIM AD(0 TO 6) AS LOCAL INTEGER AD(0)= @sr.xa AD(1)= @sr.ya AD(2)= @sr.za AD(3)= @sr.xyza AD(4)= @sr.xf AD(5)= @sr.yf AD(6)= @sr.zf Task(%Lock).freq = App.tempo/ 60! SHIFT RIGHT AD(4), 6 ' 0-63 n(0) = 64 + AD(4) n(3) = 64 - AD(4) SHIFT RIGHT AD(5), 6 n(1) = 64 + AD(5) n(4) = 64 - AD(5) SHIFT RIGHT AD(6), 6 n(2) = 64 + AD(6) n(5) = 64 - AD(6) SHIFT RIGHT AD(0), 8 ' 0-15 v(0) = AD(0) v(3) = AD(0) SHIFT RIGHT AD(1), 8 v(1) = AD(1) v(4) = AD(1) SHIFT RIGHT AD(2), 8 v(2) = AD(2) v(5) = AD(2) SHIFT RIGHT AD(3), 6 ' 0-63 IF AD(3) <= @sr.noise THEN v(0) = 0 v(1) = 0 v(2) = 0 v(3) = 0 v(4) = 0 v(5) = 0 END IF END SUB SUB UnLocked () IF ISFALSE Task(%UnLock).tog THEN Bom.algo = 14 ' same as lock Bom.subpatch = 1 ' unlock App.tempo = 120 @sr.noise = 2 @sr.ascale = 8 @sr.dta = 24 MakeTaskUnique %UnLock Bom.subpatch = 1 ProtPat n(6) = 10 v(6) = 127 Task(%UnLock).freq = App.tempo / 60 Task(%Rivox_0).freq = 120 Task(%Rivox_1).freq = 122 Task(%Rivox_2).freq = 124 Task(%Rivox_3).freq = 126 Task(%Rivox_4).freq = 128 Task(%Rivox_5).freq = 130 StartTask %RiVox_0 StartTask %RiVox_1 StartTask %RiVox_2 StartTask %RiVox_3 StartTask %RiVox_4 StartTask %RiVox_5 Task(%UnLock).tog = %True END IF DIM AD(0 TO 15) AS LOCAL INTEGER AD(0)= @sr.xa AD(1)= @sr.ya AD(2)= @sr.za AD(3)= @sr.xyza AD(4)= @sr.xf AD(5)= @sr.yf AD(6)= @sr.zf AD(12)= @sr.xac / 64 ' so range is -32 to + 31 AD(13)= @sr.yac / 64 AD(14)= @sr.zac / 64 Task(%Unlock).freq = App.tempo/ 60! 'UNLOCK: SHIFT RIGHT AD(0),5 SHIFT RIGHT AD(1),5 ' 0-127 SHIFT RIGHT AD(2),5 SHIFT RIGHT AD(3),5 v(0) = AD(0) OR AD(3) ' these determine the playing tempo of the Rivox tasks! v(1) = AD(1) OR AD(3) v(2) = AD(2) OR AD(3) n(0) = 48 + (ABS(AD(12)\8) * 12) '48 in rust ===> max. 96 n(1) = 48 + (ABS(AD(13)\8) * 12) n(2) = 48 + (ABS(AD(14)\8) * 12) 'n(0) = ABS(AD(12)-8) * 12 was: in rust: (16-8)* 12 ==> 96, max= 'n(1) = ABS(AD(13)-8) * 12 'n(2) = ABS(AD(14)-8) * 12 SHIFT RIGHT AD(4), 8 ' 0-15 SHIFT RIGHT AD(5), 8 SHIFT RIGHT AD(6), 8 n(0) = n(0) + AD(4) ' 48 - 112 n(1) = n(1) + AD(5) n(2) = n(2) + AD(6) ' following can remain: IF n(0) > 127 THEN n(0) = 120 IF n(1) > 127 THEN n(1) = 121 IF n(2) > 127 THEN n(2) = 122 END SUB SUB Hammers () EXPORT LOCAL adval AS INTEGER LOCAL n AS INTEGER IF ISFALSE Task(%Hammers).tog THEN Task(%Hammers).tog = %True Bom.algo = 15 Bom.mapping = %False Bom.subpatch = %False App.tempo = 1200 @sr.noise = 0 Task(%Hammers).freq = App.tempo / 60! @sr.ascale = 2 Task(%Vox_0).channel = 0 Task(%Vox_1).channel = 1 Task(%Vox_2).channel = 2 Task(%Vox_4).channel = 4 Task(%Vox_0).freq = App.tempo / (60! * 2.2) Task(%Vox_1).freq = App.tempo / (60! * 2.4) Task(%Vox_2).freq = App.tempo / (60! * 2.6) Task(%Vox_4).freq = App.tempo / (60! * 3.8) MakeTaskUnique %Hammers StartTask %Vox_0 StartTask %Vox_1 StartTask %Vox_2 StartTask %Vox_4 LOCAL m AS ASCIIZ * 20 m = "Go slowly faster and faster ... !" SetDlgItemText gh.Cockpit, %GMT_MSG2, m END IF ' uses multitasker for note-playing: Task(%Hammers).freq = App.tempo / 60! Task(%Vox_0).freq = App.tempo / 132! Task(%Vox_1).freq = App.tempo / 144! Task(%Vox_2).freq = App.tempo / 156! Task(%Vox_4).freq = App.tempo / 228! n = @sr.xa SHIFT RIGHT n,5 v(0) = n n = @sr.ya SHIFT RIGHT n,5 v(1) = n n = @sr.za SHIFT RIGHT n,5 v(2) = n n = @sr.xyza SHIFT RIGHT n,2 IF n > 127 THEN n = 127 v(3) = n n = @sr.xf SHIFT RIGHT n,9 '0-7 n(0) = n * 12 '0-84 n = @sr.yf SHIFT RIGHT n,9 n(1) = n * 12 n = @sr.zf SHIFT RIGHT n,9 n(2) = n * 12 ' for debug: ' SetDlgItemText hCockpit, %GMT_MSG2, STR$(n(0)) + STR$(v(0)) IF n(0) > 12 THEN n = @sr.xac \ 32 IF n > 31 THEN n=31 IF n < -32 THEN n= -32 n(0) = n(0) + n IF n(0) < 1 THEN n(0) = 1 IF n(0) > 127 THEN n(0) = 127 ELSE v(0) = %False n(0) = %False END IF IF n(1) > 12 THEN n = @sr.yac \ 32 IF n > 31 THEN n= 31 IF n < -32 THEN n=-32 n(1) = n(1) + n IF n(1) < 1 THEN n(1) = 1 IF n(0) > 127 THEN n(0) = 127 ELSE v(1) = %False n(1) = %False END IF IF n(2) > 12 THEN n = @sr.zac \ 32 IF n> 31 THEN n=31 IF n < -32 THEN n = -32 n(2) = n(2) + n IF n(2) < 1 THEN n(2) = 1 IF n(2) > 127 THEN n(2) = 127 ELSE v(2) = %False n(2) = %False END IF IF (n(0) <> n(1)) AND (n(1) <> n(2)) AND (n(0) <> n(2)) THEN IF (v(0) * v(1) > 0) AND (v(2) > 0) AND (n(0) * n(1) > 0) AND (n(2) > 0) THEN n(4) = MAX%(n(0),n(1),n(2)) v(4)= v(3)/4 END IF END IF END SUB SUB Solo () EXPORT ' first piece of the second book of moves. ' needs ii-channels 3, 7, STATIC oldnote AS INTEGER, oldvelo AS INTEGER LOCAL note AS INTEGER, velo AS INTEGER LOCAL il%, jl% IF ISFALSE Task(%Solo).tog THEN @sr.noise = 5 @sr.ascale = 2 App.tempo = 360 ' we need a RT controll for the patches!!! ==> function keys oldnote = %False oldvelo = %False Task(%Solo).channel = 1 ' panned to center Task(%Solo).tog = %True Task(%Solo).freq = App.tempo / 60! ' 6 Hz Bom.algo = 16 Bom.mapping = 0 MakeTaskUnique %Solo LOCAL m AS ASCIIZ * 45 m = "Change instruments... alternate with Tance !" SetDlgItemText gh.Cockpit,%GMT_MSG2, m END IF ' Solo instrument. Non-positional playing. ' Use supertonal scale in Notes(Bom.algo=16,Bom.mapping=0,noot) ' Midi-channel 1 (145) is used, for its default central panning. Task(%Solo).freq = App.tempo / 60! jl% = @sr.xyzf SHIFT RIGHT jl%, 7 ' 0-32 il% = jl% \ 16 ' 0 or 1 IF il% THEN il% = 72 ELSE il% = 60 ' octave position note = Notes(Bom.algo, Bom.mapping, jl% MOD 16) + il% ' il% = 4 * SQR(@sr.xyze) ' 0 - 256 ' velo = @sr.xyza ' SHIFT RIGHT velo,4 ' 0 - 256 - 8 bits ' velo= velo + il% ' 0 - 512 ' 04.11.2003: changed to: il% = @sr.xyze / 32 ' 0-127 velo = @sr.xyza / 32 ' 0-127 velo = velo + il% ' 0-255 IF velo > 127 THEN velo = 127 ' here we loose a lot of information for velo... IF velo < (@sr.noise * 4) THEN velo = %False IF oldnote THEN NoteOff Task(%Solo).channel,oldnote IF note THEN NoteOff Task(%Solo).channel,note oldvelo = %False velo = %False IF BIT(Task(%Bom_PitchbendTask).swit,%TASK_ONOFF) THEN Task(%Bom_PitchbendTask).duur = %False Task(%Bom_PitchbendTask).tog = %False StopTask %Bom_PitchbendTask END IF EXIT SUB END IF IF velo THEN IF note <> oldnote THEN IF note THEN mPlay Task(%Solo).channel, note, velo IF oldnote THEN NoteOff Task(%Solo).channel, oldnote oldnote = note oldvelo = velo ELSE IF velo <> oldvelo THEN IF note THEN mPlay Task(%Solo).channel, note, velo oldvelo = velo END IF END IF ' Bom99: pitch-bend routine: ' we have to start a pitchbend task at this place! IF App.tempo < 60 THEN App.tempo = 60 IF ISFALSE BIT(Task(%Bom_PitchbendTask).swit,%Task_ONOFF) THEN ' added 21.11.2000 Task(%Bom_PitchbendTask).duur = 60000 / App.tempo ' moet in ms Task(%Bom_PitchbendTask).channel = Task(%Solo).channel Task(%Bom_PitchbendTask).tog = %False StartTask %Bom_PitchbendTask END IF END IF END SUB SUB SoloBend () EXPORT ' the duration for this task should be passed in Task(%Bom_PitchbendTask).duur . Expressed in ms. ' The channel should be set by the caller in Task(tasknr).channel. ' This task is used by Solo as well as Rising to perform the pitch bends. STATIC stoptijd AS LONG LOCAL acceleratie AS INTEGER LOCAL i AS LONG IF Task(%Bom_PitchbendTask).tog = %False THEN Task(%Bom_PitchbendTask).tog = %True stoptijd = timeGetTime + Task(%Bom_PitchbendTask).duur ' in ms. - set by the caller END IF IF timeGetTime >= stoptijd THEN Task(%Bom_PitchbendTask).duur = %False Task(%Bom_PitchbendTask).tog = %False Task(%Bom_PitchbendTask).channel = %False ' the channel must be set by the caller Stoptask %Bom_PitchbendTask ELSE IF BIT(Task(%Solo).swit,%TASK_ONOFF) THEN ' monochannel pitch bend for Solo ' changed 31.10.2003: acceleratie = MIN(64 + (@sr.xyzac / 16), 127) acceleratie = MAX(0,acceleratie) Bend Task(%Bom_PitchbendTask).channel, 0, acceleratie ELSEIF BIT(Task(%Rising).swit,%TASK_ONOFF) THEN ' multichannel pitch bend for rising acceleratie = @sr.xyzac \ 32 acceleratie = 64 + acceleratie ' make unipolar FOR i = 0 TO 7 IF n(i) THEN Bend Task(%Rising).channel + i, 0, acceleratie END IF NEXT i END IF END IF END SUB SUB Drum () ' Experimental percussion-instrument ' using acceleration and energy-amplitude only... ' Drum is played only on sign change of acceleration channel ' Patch-changes via functionkeys! (20 patches possible) STATIC Jumpval AS BYTE LOCAL a0%, idr% LOCAL dummy AS BYTE STATIC noot AS INTEGER STATIC oldaccel AS INTEGER IF ISFALSE Task(%Drum).tog THEN Task(%Drum).tog = %True Bom.algo = 17 Bom.mapping = 0 Task(%Drum).channel = 0 @sr.noise = 1 App.tempo = DAQparams.scanfreq * 60 / 2 Jumpval = %False Task(%Drum).freq = DAQparams.scanfreq / 2 ' App.tempo / 60 ' to be checked @sr.ascale = 4 MakeTaskUnique %Drum ' rt controll for patchchanges : F1 - F4 LOCAL m AS ASCIIZ * 35 m = "Change percussion sets...[F1-F4]" SetDlgItemText gh.Cockpit,%GMT_MSG2, m END IF ' get peak amplitude: a0% = @sr.xyza 'MAX%(DataBuf0(t),DataBuf1(t),DataBuf2(t),DataBuf3(t)) SHIFT RIGHT a0%, 5 ' 7 bits IF a0% < @sr.noise THEN EXIT SUB idr% = AkselPiek ' aperturetime set via sonar ctrl dT slider ' scaling via U/D 12 controller IF idr% = %False THEN oldaccel = %False : EXIT SUB IF (idr% > %False) AND (oldaccel =< %False) THEN noot = 48 - (idr%/2) ' 49 -> 112 , idr% moet steeds positief zijn!!! mPlay Task(%Drum).channel + 1, noot, a0% oldaccel = idr% END IF IF (idr% < %False) AND (oldaccel >= %False) THEN noot = 48 - (idr%/2) ' 49 -> 112 , idr% moet steeds negatief zijn!!! mPlay Task(%Drum).channel + 1, noot, a0% oldaccel = idr% END IF END SUB SUB Edges () EXPORT STATIC c%, Mep% STATIC Flag% LOCAL timeframe AS WORD ' in ms. LOCAL il%, k% , nr% STATIC nrsamp AS WORD IF ISFALSE Task(%Edges).tog THEN Task(%Edges).tog = %True Task(%Edges).channel = %False Bom.algo = 18 Bom.mapping = 0 Flag% = 3 timeframe = 800 nrsamp = (DAQparams.scanfreq * timeframe/1000!)/ 4 ' = 12.8 ' Patches F1-F3 App.tempo = 600 Task(%Edges).freq = App.tempo / 60! @sr.noise = %False MakeTaskUnique %Edges LOCAL m AS ASCIIZ * 26 m = "F1-F3 patches" SetDlgItemText gh.Cockpit, %GMT_MSG2, m ' komt onder de groupbox Awaiting / Expecting END IF ' Deze routine moet vanuit 3 reeksen van 4 samples de omkering van de ' van de beweging afleiden. Konditie: Ft0 < Ft1 < Ft2 > Ft3 ' Er is een sample-array voor nodig : Samp%(4,16) ' Instrumentatie: via kanalen 4,5,6!. DIM Samp(0 TO 3,0 TO 7) AS LOCAL WORD ' berekening van het timeframe voor de bewegingsanalyze: ' moet ca. 1 seconde zijn! ' dus per interval 1sec / 4 = 250ms ' aantal samples per interval = DAQparams.scanrate * (timeframe/1000) / 4 FOR k% = 4 TO 6 SELECT CASE k% CASE 4 Samp(3,k%) = Databuf4(255) Samp(2,k%) = Databuf4(255-nrsamp) Samp(1,k%) = DataBuf4(255-(2*nrsamp)) Samp(0,k%) = DataBuf4(255-(3*nrsamp)) CASE 5 Samp(3,5) = Databuf5(255) Samp(2,5) = Databuf5(255-nrsamp) Samp(1,5) = DataBuf5(255-(nrsamp*2)) Samp(0,5) = DataBuf5(255-(nrsamp *3)) CASE 6 Samp(3,6) = Databuf6(255) Samp(2,6) = Databuf6(255-nrsamp) Samp(1,6) = DataBuf6(255-(2*nrsamp)) Samp(0,6) = DataBuf6(255-(3*nrsamp)) END SELECT SHIFT RIGHT Samp(3,k%),6 ' res = 6 ? 0-63 SHIFT RIGHT Samp(2,k%),6 SHIFT RIGHT Samp(1,k%),6 SHIFT RIGHT Samp(0,k%),6 IF (Samp(0, k%) < Samp(1, k%)) AND (Samp(1, k%) < Samp(2, k%)) AND (Samp(2, k%) > Samp(3, k%)) THEN Mep% = %True n(k%) = Samp(2, k%) * Flag% v(k%) = Samp(2, k%) * 4 IF n(k%) > 96 THEN n(k%) = 84 + (n(k%) MOD 12) IF n(k%) < 36 THEN n(k%) = 36 + (n(k%) MOD 12) IF v(k%) > 127 THEN v(k%) = 127 IF v(k%) < @sr.noise THEN v(k%) = %False mPlay Task(%Edges).channel + k%, n(k%), v(k%) ELSE Mep% = %False END IF IF (Samp(0, k%) > Samp(1, k%)) AND (Samp(1, k%) > Samp(2, k%)) AND (Samp(2, k%) > Samp(3, k%)) THEN NoteOff Task(%Edges).channel + k%, n(k%) Mep% = %False END IF NEXT k% ' harmony-counter - not in use! IF Mep% THEN c% = (c% + 1) MOD 7: ' counts 0...6 IF c% = 0 THEN Flag% = ((Flag% + 1) AND 1) + 3 ' counts 3,4 Task(%Edges).freq = App.tempo / 60! END SUB SUB Tance () EXPORT LOCAL tc% LOCAL jl% LOCAL sig! IF ISFALSE Task(%Tance).tog THEN Task(%Tance).tog = %True Bom.algo = 19 Bom.mapping = 0 @sr.noise = %False App.tempo = 330 Task(%Tance).channel = %False Task(%Tance).freq = App.tempo / 60! DIM no(0 TO 3) AS STATIC BYTE MakeTaskUnique %Tance ' set panning: ModeMess Task(%Tance).channel + 0, 10, 64 ModeMess Task(%Tance).channel + 1, 10, 0 ModeMess Task(%Tance).channel + 2, 10, 127 ModeMess Task(%Tance).channel + 3, 10, 40 ' new 23.10.2003: @sr.dta = 4 END IF ' nog te doen: modulaties invoeren via Tc% + 6 of Tc% + 8 ' de melodie wordt via bewegingsinformatie gespeeld, de harmonie volgt algoritmisch ' dynamiek en tempo zijn bewegingsafhankelijk. ' de sopraan is non-positioneel te bespelen (zoals in solo). ' Use scale in Notes(Bom.algo,Bom.mapping= 0, noot) = sopraan ' Notes(Bom.algo,Bom.mapping= 1, noot) = alt ' Notes(Bom.algo,Bom.mapping= 2, noot) = tenor ' Notes(Bom.algo,Bom.mapping= 3, noot) = bas jl% = @sr.xyzf SHIFT RIGHT jl%, 8 ' 0-15 Task(%Tance).freq = App.tempo / 60! tc% = 0 IF jl% > @sr.noise THEN n(0) = Notes(Bom.algo, 0, jl%) + 72 + tc% n(1) = Notes(Bom.algo, 1, jl%) + 60 + tc% n(2) = Notes(Bom.algo, 2, jl%) + 60 + tc% n(3) = Notes(Bom.algo, 3, jl%) + 48 + tc% ELSE n(0) = 0 n(1) = 0 n(2) = 0 n(3) = 0 ' schakel oude noten uit, als er waren...: IF no(0) THEN NoteOff Task(%Tance).channel , no(0) IF no(1) THEN NoteOff Task(%Tance).channel + 1, no(1) IF no(2) THEN NoteOff Task(%Tance).channel + 2, no(2) IF no(3) THEN NoteOff Task(%Tance).channel + 3, no(3) EXIT SUB END IF v(0) = @sr.amp ' @sr.xyza SHIFT RIGHT v(0),4 ' was 5 ' 0-127 IF v(0) > 127 THEN v(0) = 127 IF n(0) AND (n(0) <> no(0)) THEN IF no(0) THEN NoteOff Task(%Tance).channel, no(0) mPlay Task(%Tance).channel, n(0), v(0) no(0) = n(0) END IF IF n(1) AND (n(1) <> no(1)) THEN IF no(1) THEN NoteOff Task(%Tance).channel+ 1, no(1) mPlay Task(%Tance).channel + 1, n(1), v(0) '\ 2 no(1) = n(1) END IF IF n(2) AND (n(2) <> no(2)) THEN IF no(2) THEN NoteOff Task(%Tance).channel+ 2, no(2) mPlay Task(%Tance).channel + 2, n(2), v(0) '\ 2 no(2) = n(2) END IF IF n(3) AND (n(3) <> no(3)) THEN IF no(3) THEN NoteOff Task(%Tance).channel + 3, no(3) mPlay Task(%Tance).channel + 3, n(3), v(0) no(3) = n(3) END IF END SUB SUB Stresso () EXPORT ' we need an interaction window here!!! STATIC circnt% STATIC no() AS BYTE LOCAL pt%, xyz% LOCAL kanaal AS BYTE IF ISFALSE Task(%Stresso).tog THEN Task(%Stresso).tog = %True Task(%Stresso).channel = %False App.Tempo = 540 Task(%Stresso).freq = App.Tempo / 60 DIM Stress AS STATIC StressoType DIM Sample(0 TO 2048) AS STATIC INTEGER DIM no(0 TO 15) Bom.algo = 20 Bom.mapping = %False Bom.tog = %False Bom.sustain = %False @sr.noise = 1 '%False [ changed after rehearsal 22.08.1999] circnt% = %False Bom.Subpatch = %False Stress.Interact = %False Stress.Finale = %True ' sic Stress.Invert = %False Stress.Delay = 1 Stress.NrOfSections = 16 Stress.SectionCount = %False Stress.Starttime = timeGetTime Stress.Duration = 20000 * Stress.NrOfSections Stress.StopTime = Stress.Starttime + Stress.Duration Stress.Automatic = %True 'Automaat% = %True MakeTaskUnique %Stresso END IF ' uses Sample%(2048) for recording - 16 voices Task(%Stresso).freq = App.tempo / 60! IF Stress.Automatic THEN Stress.Sectioncount = (timeGetTime - Stress.Starttime) \ (Stress.Duration / Stress.NrOfSections) IF Stress.SectionCount > Stress.NrOfSections -1 THEN Stress.SectionCount = Stress.NrOfSections - 1 ' per 20" sekonden ' dT% = ((tnow /1000!) - tim!) \ (60!/App.tempo) ' real-time variable via App.tempo ' automaat% voor patches en mappings: IF Stress.SectionCount <> Bom.Subpatch THEN IF Bom.Subpatch < Stress.NrOfSections THEN ' om de 20 sekonden wisselt de instrumentatie ' evenals de mapping (er zijn 16 mappings) Bom.Subpatch = Stress.SectionCount Bom.mapping = Stress.SectionCount Protpat UpdateMonitor END IF END IF IF Stress.Finale THEN IF ISFALSE Stress.Interact THEN IF Stress.SectionCount <= 4 THEN Stress.delay = Stress.SectionCount ^ 3 IF Stress.delay < 2 THEN Stress.delay = 1 ELSE Stress.Interact = %True Stress.Invert = %False UpdateMonitor END IF END IF IF Stress.Interact THEN IF ISFALSE Stress.Invert THEN IF Stress.SectionCount > 8 THEN Stress.Finale = %False Stress.Interact = %True Stress.Invert = %True UpdateMonitor END IF END IF END IF END IF ' voor finale% END IF ' voor automaat% IF Bom.mapping > Stress.NrOfSections - 1 THEN Bom.mapping = Stress.NrOfSections -1 IF Bom.Subpatch > Stress.NrOfSections - 1 THEN Bom.Subpatch = Stress.NrOfSections -1 IF Stress.Interact THEN IF Stress.invert THEN ' changed 04.11.2003 IF (@sr.xyze^2)/%d12 > %False THEN Stress.delay = 16 - INT(15.268 * LOG(@sr.xyze)) ELSE Stress.delay = 16 ELSE IF (@sr.xyze^2)/%d12 > %False THEN Stress.delay = INT(15.268 * LOG(@sr.xyze)) \ 2 ELSE Stress.delay = %False END IF END IF IF Stress.delay < 0 THEN Stress.delay = 0 IF Stress.delay > 64 THEN Stress.delay = 64 circnt% = (circnt% + 1) AND &H7FF Sample%(circnt%) = @sr.xyzf ' we only record the velocity channel SHIFT RIGHT Sample%(circnt%), 8 ' in 4 bit resolution (0-15) ' speel het sample-array als een canon: FOR kanaal = 0 TO 15 ' ringteller-algoritme: pt% = (circnt% - (Stress.delay * kanaal)) AND &H7FF n(kanaal) = Notes(Bom.algo, Bom.mapping, Sample%(pt%)) + 60 IF Sample%(pt%) AND (n(kanaal) <> no(kanaal)) THEN ' vorige noot uit NoteOff Task(%Stresso).channel + kanaal, no(kanaal) xyz% = @sr.xyza ' make it 7 bits SHIFT RIGHT xyz%, 5 mPlay Task(%Stresso).channel + kanaal, n(kanaal), xyz% no(kanaal) = n(kanaal) END IF IF Bom.sustain = 0 THEN IF ISFALSE (Sample%(pt%)) AND (@sr.xyza <= @sr.noise *256) THEN NoteOff Task(%Stresso).channel + kanaal, no(kanaal) no(kanaal) = n(kanaal) END IF END IF NEXT kanaal END SUB SUB Jogyaka () EXPORT ' kode Jogyakarta STATIC oldX AS INTEGER, oldY AS INTEGER, oldZ AS INTEGER LOCAL nootX AS INTEGER, nootY AS INTEGER, nootZ AS INTEGER LOCAL veloX AS INTEGER, veloY AS INTEGER, veloZ AS INTEGER LOCAL dummy AS INTEGER IF Task(%Jogyaka).tog = %False THEN Task(%Jogyaka).tog = %True oldX = %False oldY = %False oldZ = %False Bom.algo = 21 @sr.noise = 1 App.tempo = 420 Bom.tog = %False Bom.sustain = %False ' controls: mapping Task(%Jogyaka).freq = App.tempo / 60! MakeTaskUnique %Jogyaka END IF nootX = @sr.xf SHIFT RIGHT nootX,5 nootY = @sr.yf SHIFT RIGHT nootY,5 nootZ = @sr.zf SHIFT RIGHT nootZ,5 veloX = @sr.xa SHIFT RIGHT veloX,5 veloY = @sr.ya SHIFT RIGHT veloY,5 veloZ = @sr.za SHIFT RIGHT veloZ,5 dummy = @sr.amp '@sr.xyza - modif 31.10.2003 SHIFT RIGHT dummy,5 IF dummy <= @sr.noise THEN IF oldX > %False THEN NoteOff 0, oldX : oldX = %False IF oldY > %False THEN NoteOff 1, oldY : oldY = %False IF oldZ > %False THEN NoteOff 2, oldZ : oldZ = %False EXIT SUB ELSE IF veloX > @sr.noise THEN IF oldX THEN IF nootX <> oldX THEN NoteOff 0, oldX IF nootX > %False THEN mPlay 0, nootX, veloX oldX = nootX ELSE oldX = %False END IF ELSE ' zelfde noot: we doen niks. END IF ELSE IF nootX > %False THEN mPlay 0, nootX, veloX oldX = nootX END IF END IF ELSE IF oldX THEN NoteOff 0, oldX oldX = %False END IF END IF ' --- Y ---- IF veloY > @sr.noise THEN IF oldY THEN IF nootY <> oldY THEN NoteOff 1, oldY IF nootY > %False THEN mPlay 1, nootY, veloY oldY = nootY ELSE oldY = %False END IF END IF ELSE IF nootY > %False THEN mPlay 1, nootY, veloY oldY = nootY END IF END IF ELSE IF oldY THEN NoteOff 1, oldY oldY = %False END IF END IF ' ---- Z ----- IF veloZ > @sr.noise THEN IF oldZ THEN IF nootZ <> oldZ THEN NoteOff 2, oldZ IF nootZ > %False THEN mPlay 2, nootZ, veloZ oldZ = nootZ ELSE oldZ = %False END IF END IF ELSE IF nootZ > %False THEN mPlay 2, nootZ, veloZ oldZ = nootZ END IF END IF ELSE IF oldZ THEN NoteOff 2, oldZ oldZ = %False END IF END IF ' ------------ END IF END SUB SUB Tempi () EXPORT STATIC Flag AS BYTE IF ISFALSE Task(%Tempi).tog THEN Task(%Tempi).tog = %True Bom.algo = 22 Bom.mapping = %False Bom.subpatch = %False @sr.noise = 1 ' patches: F1-F5 Flag = %False App.Tempo = 100 ' was 200 Task(%Tempi).freq = 32 '3 ' moet steeds trager zijn dan de gestuurde tasks!!! @sr.ascale = 4! MakeTaskUnique %Tempi Task(%Vox_0).freq = 190 Task(%Vox_1).freq = 230 Task(%Vox_2).freq = 270 StartTask %Vox_0 StartTask %Vox_1 StartTask %Vox_2 END IF ' Here the playing-tempo is made to be movement dependent! DIM AD(0 TO 15) AS LOCAL INTEGER AD(0) = @sr.xa SHIFT RIGHT AD(0),8 AD(1) = @sr.ya SHIFT RIGHT AD(1),8 AD(2) = @sr.za SHIFT RIGHT AD(2),8 SHIFT LEFT AD(0),3 SHIFT LEFT AD(1),3 SHIFT LEFT AD(2),3 v(0) = AD(0) v(1) = AD(1) v(2) = AD(2) AD(12) = @sr.xac/ 32 AD(13) = @sr.yac/ 32 AD(14) = @sr.zac/ 32 n(0) = ABS(AD(12)) ' 0-64 n() is BYTE !!! n(1) = ABS(AD(13)) n(2) = ABS(AD(14)) AD(7) = @sr.xyzf SHIFT RIGHT AD(7),9 ' 0-7 IF n(0) > @sr.noise THEN n(0) = n(0) + 48 Task(%Vox_0).freq = (App.tempo * (AD(7)+1))/ 60! ELSE n(0) = 0 v(0) = 0 Task(%Vox_0).freq = App.tempo/ 60! END IF IF n(1) > @sr.noise THEN n(1) = n(1) + 48 Task(%Vox_1).freq = (App.tempo * (AD(7)+1))/ 60! ELSE n(1) = 0 v(1) = 0 Task(%Vox_1).freq = App.tempo / 60! END IF IF n(2) > @sr.noise THEN n(2) = n(2) + 48 Task(%Vox_2).freq = (App.tempo * (AD(7)+1))/ 60! ELSE v(2) = 0 n(2) = 0 Task(%Vox_2).freq = App.tempo / 60! END IF IF Bom.tog THEN IF ISFALSE Flag THEN StartTask %Vox_3 StartTask %Vox_4 StartTask %Vox_5 Flag = %True END IF IF n(0) > @sr.noise THEN v(3) = AD(0) n(3) = 64 + (AD(12)/2) AD(4) = @sr.xf SHIFT RIGHT AD(4),9 ' 0-7 Task(%Vox_3).freq = (App.tempo * (AD(4)+1))/ 60! ELSE n(3) = 0 v(3) = 0 Task(%Vox_3).freq = App.tempo / 60! END IF IF n(1) > @sr.noise THEN v(4) = AD(1) n(4) = 64 + (AD(13)/2) AD(5) = @sr.yf SHIFT RIGHT AD(5),9 ' 0-7 Task(%Vox_4).freq = (App.tempo * (AD(5)+1))/ 60! ELSE n(4) = 0 v(4) = 0 Task(%Vox_4).freq = App.tempo / 60! END IF IF n(5) > @sr.noise THEN v(5) = AD(2) n(5) = 64 + (AD(14)/2) AD(6) = @sr.zf SHIFT RIGHT AD(6),9 ' 0-7 Task(%Vox_5).freq = (App.tempo * (AD(6)+1))/ 60! ELSE v(5) = 0 n(5) = 0 Task(%Vox_5).freq = App.tempo / 60! END IF ELSE IF Flag THEN StopTask %Vox_3 StopTask %Vox_4 StopTask %Vox_5 Flag = %False END IF END IF Task(%Tempi).freq = (MIN(Task(%Vox_0).freq, Task(%Vox_1).freq, Task(%Vox_2).freq)) / 3 END SUB ' ----------------------------- ' following 7 tasks play voices in independent periods. SUB Vox_0 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(0) THEN IF (n(0) = oldnote) AND (n(0) > %False) THEN NoteOff Task(%Vox_0).channel, n(0) oldnote = %False END IF ELSE IF n(0) THEN mPlay Task(%Vox_0).channel, n(0), v(0) oldnote = n(0) END IF END IF END SUB SUB Vox_1 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(1) THEN IF (n(1) = oldnote) AND (n(1) > %False) THEN NoteOff Task(%Vox_1).channel, n(1) oldnote = %False END IF ELSE IF n(1) THEN mPlay Task(%Vox_1).channel, n(1), v(1) oldnote = n(1) END IF END IF END SUB SUB Vox_2 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(2) THEN IF (n(2) = oldnote) AND (n(2) > %False) THEN NoteOff Task(%Vox_2).channel, n(2) oldnote = %False END IF ELSE IF n(2) THEN mPlay Task(%Vox_2).channel, n(2), v(2) oldnote = n(2) END IF END IF END SUB SUB Vox_3 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(3) THEN IF (n(3) = oldnote) AND (n(3) > %False) THEN NoteOff Task(%Vox_3).channel, n(3) oldnote = %False END IF ELSE IF n(3) THEN mPlay Task(%Vox_3).channel, n(3), v(3) oldnote = n(3) END IF END IF END SUB SUB Vox_4 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(4) THEN IF (n(4) = oldnote) AND (n(4) > %False) THEN NoteOff Task(%Vox_4).channel, n(4) oldnote = %False END IF ELSE IF n(4) THEN mPlay Task(%Vox_4).channel, n(4), v(4) oldnote = n(4) END IF END IF END SUB SUB Vox_5 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(5) THEN IF (n(5) = oldnote) AND (n(5) > %False) THEN NoteOff Task(%Vox_5).channel, n(5) oldnote = %False END IF ELSE IF n(5) THEN mPlay Task(%Vox_5).channel, n(5), v(5) oldnote = n(5) END IF END IF END SUB SUB Vox_6 () EXPORT STATIC oldnote AS BYTE IF ISFALSE v(6) THEN IF (n(6) = oldnote) AND (n(6) > %False) THEN NoteOff Task(%Vox_6).channel, n(6) oldnote = %False END IF ELSE IF n(6) THEN mPlay Task(%Vox_6).channel, n(6), v(6) oldnote = n(6) END IF END IF END SUB SUB RiVox_0 () ' used in Lock - Unlock - here tempo is modulated by movement. STATIC oldnote AS BYTE IF n(0) THEN IF v(0) THEN mPlay Task(%RiVox_0).channel, n(0), v(0) oldnote = n(0) ELSE IF (n(0) = oldnote) AND (oldnote > %False) THEN NoteOff Task(%Rivox_0).channel, n(0) oldnote = %False END IF END IF Task(%RiVox_0).freq = v(0) / 20.0 ' 10 IF Task(%RiVox_0).freq = 0 THEN Task(%RiVox_0).freq = 0.25 ELSE Task(%RiVox_0).freq = 1 END IF END SUB SUB RiVox_1 () IF n(1) THEN mPlay Task(%RiVox_1).channel, n(1), v(1) Task(%RiVox_1).freq = v(1)/ 20.0 '10 IF Task(%RiVox_1).freq = 0 THEN Task(%RiVox_1).freq = 0.25 ELSE Task(%RiVox_1).freq = 1 END IF END SUB SUB RiVox_2 () IF n(2) THEN mPlay Task(%RiVox_2).channel, n(2), v(2) Task(%RiVox_2).freq = v(2) / 20.0 '10 IF Task(%RiVox_2).freq = 0 THEN Task(%RiVox_2).freq = 0.25 ELSE Task(%RiVox_2).freq = 1 END IF END SUB SUB RiVox_3 () IF n(0) THEN mPlay Task(%RiVox_3).channel, ((n(0) + n(1))/ 2) , v(0) Task(%RiVox_3).freq = v(0) / 20.0 '10 IF Task(%RiVox_3).freq = 0 THEN Task(%RiVox_3).freq = 0.25 ELSE Task(%RiVox_3).freq = 0.9 END IF END SUB SUB RiVox_4 IF n(1) THEN mPlay Task(%RiVox_4).channel, ((n(1) + n(2)) / 2), v(1) Task(%RiVox_4).freq = v(1) / 20.0 '10 IF Task(%RiVox_4).freq = 0 THEN Task(%RiVox_4).freq = 0.25 ELSE Task(%RiVox_4).freq = 0.9 END IF END SUB SUB RiVox_5 IF n(2) THEN mPlay Task(%RiVox_5).channel, ((n(0) + n(2)) / 2) , v(2) Task(%RiVox_5).freq = v(2) / 20.0 '10 IF Task(%RiVox_5).freq = 0 THEN Task(%RiVox_5).freq = 0.25 ELSE Task(%RiVox_5).freq = 0.9 END IF END SUB SUB MakeTaskUnique (tasknr AS INTEGER) LOCAL cptr AS DWORD ' BOM & Songbook pieces exclude each other... ' functions performed by this procedure: ' - makes the composition unique: comps. exclude each other in Songbook and Book of Moves ' - stops auxiliary task, if in use ' - silences the synths ' - sets harmonizer if songbook composition is choosen ' - sends patches to proteus ' - clears the midi buffers for songbook ' - resets toggle button (bom.tog = %False) ' - resets sustain (bom.sustain) ' - resets fase (bom.fade) ' - sets slider in Sonar Control Window to @sr.noise ' - sets UD label in Sonar Control Window to @sr.ascale ' debug: SELECT CASE tasknr CASE %Open TO %Tempi ' IF Bom.algo <> tasknr - %BomBaseTask + 1 THEN warning "Error in Bom tasknr / bom.algo" CASE %Unlock ' the exception is %Unlock = %Tempi + 1 , with Bom.also = 14 CASE %Intro TO %Free ' IF Bom.algo <> tasknr - 25 THEN warning "Error in Songbook tasknr / bom.algo" CASE %Simple, %triple CASE ELSE EXIT SUB END SELECT LOCAL m AS ASCIIZ * 30 LOCAL i AS BYTE LOCAL t AS DWORD FOR i = %Rivox_0 TO %Rivox_5 IF BIT(Task(i).swit,%TASK_ONOFF) THEN StopTask i NEXT i FOR i = %BomBaseTask TO UBOUND(Task) 'lowest tasknumber in BOM to highest tasknumber in Songbook IF i = tasknr THEN ITERATE FOR IF tasknr = %triple AND (i = %triple1) OR (i = %triple2) THEN ITERATE FOR '3 tasks go together.. IF BIT(Task(i).swit,%TASK_ONOFF) THEN StopTask i NEXT i ' switch of the pitchbend task used in Solo and Rising: IF BIT(Task(%Bom_PitchbendTask).swit,%TASK_ONOFF) THEN StopTask %Bom_PitchbendTask IF App.id <> %ID_II_MIM THEN Silence ' works only for proteus3 IF tasknr < %SongbookBaseTask THEN ProtON Meq(0), Songbook.HarChannel ELSE ProtOFF Meq(0), Songbook.HarChannel InitHarmon ClearMiBuf 0 ' empty buffer! hmi is running in the background! END IF 'Display Bom.algo, 0,0,0 ' external display 'cptr = GetPRocAddress(gh.gnh, "LEDDISPLAY") ' cptr = GetProcAddress(gh.gnh, "LEDDISPLAY") ' CALL DWORD cptr USING LedDisplay(Bom.algo, 0, 0, 0) ' new 2014: mPlay mDisp_A.channel, 3, Bom.algo \ 10 mPlay mDisp_A.channel, 4, Bom.algo MOD 10 ProtPat ' send all patches to proteus ELSE FOR i = 0 TO 15 AllNotesOff i NEXT i ProtPat ' contains condition code for MIM END IF ' BUTTONS: ' should'nt we do this by sending a message??? - no this is fine. ' reset toggle button: BIT RESET ButnSW(2).Flag, 0 SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 2, ButnSW(2).tag0 ' + " ON" Bom.tog = %False ' reset sustain button: BIT RESET ButnSW(3).Flag, 0 SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 3, ButnSW(3).tag0 ' + " ON" Bom.sustain = %False ' reset fade button: BIT RESET ButnSW(11).Flag,0 SetDlgItemText gh.Cockpit, %GMT_BUTNSW_ID + 11, ButnSW(11).tag0 ' + " ON" Bom.fade = %False ' set slider and UD values in sonar controll: t = TaskEX(%Sonar_Control_Task).SliderNumbers(0) SendMessage Slider(t).h, %TBM_SETPOS,%True, @sr.noise t = TaskEX(%Sonar_Control_Task).UpDownNumbers(0) ' scaling controll for amplitude integration UDCtrl(t).value = @sr.dta SetDlgItemText Task(%Sonar_Control_Task).hparam, %GMT_TEXT0_ID + 16, "dTa=" & STR$(@sr.dta) t = TaskEX(%Sonar_Control_Task).UpDownNumbers(1) ' scaling controll for accelleration UDCtrl(t).value = @sr.ascale SetDlgItemText Task(%Sonar_Control_Task).hparam, %GMT_TEXT0_ID + 17, "asc=" & STR$(@sr.ascale) SetDlgItemText gh.Cockpit,%GMT_TEMPO_ID, STR$(App.tempo) SetDlgItemText gh.Cockpit,%GMT_SAMPLERATE_ID, STR$(DAQparams.scanfreq) ' does never change... UpdateMonitor ' monitorwindow m = "<" + UCASE$(TRIM$(Task(tasknr).naam)) + ">" SetDlgItemText gh.Cockpit, %GMT_MSG1, m m = "" SetDlgItemText gh.Cockpit, %GMT_MSG2, m END SUB SUB Bom_FunctionkeyHandler () ' this procedure is the handler for function keys. ' It is called by its codepointer in App.FunctionkeyCptr ' The functionkeynumber can be found as LOBYT(App.fkParam) ' passes the keynumber as 1 to 12 ' with shift: F 13 - F24 ' with ctrl : F 25 - F36 ' with shift + ctrl : F37 - F48 ' not functional on Win2000, XP platforms!!!! LOCAL Functionkeynumber AS BYTE Functionkeynumber = LOBYT(App.fkParam) SELECT CASE Functionkeynumber CASE 1 TO 16 Bom.SubPatch = Functionkeynumber - 1 Protpat ' we should visualy notify the user... UpdateMonitor CASE 25 TO 40 Bom.mapping = Functionkeynumber - 25 ' we should visualy notify the user... UpdateMonitor END SELECT END SUB SUB InitHarmon () LOCAL ctrl% ProgChange Songbook.HarChannel, Patch(Bom.algo,Bom.Subpatch,Songbook.HarChannel) SLEEP 2 '1 Pacing enlarged for faster computers nowadays... FOR ctrl% = 0 TO 127 IF CcH(Bom.algo, ctrl%) > -1 THEN ModeMess Songbook.HarChannel, ctrl%,CcH(Bom.algo,ctrl%) ' CoCoc% = 176 + Harchannel SLEEP 1 END IF NEXT ctrl% END SUB SUB Tuning (Mq AS MidiEquipment, b AS BYTE) LOCAL ch AS WORD ch = 16 DO DECR ch ProteusTuning Meq(0),ch,Patch(Bom.algo, Bom.Subpatch, ch),b LOOP UNTIL ISFALSE ch END SUB SUB Silence () EXPORT ' deze sub moet de synthesizer het zwijgen opleggen... ModeMess hMidiO(0), &H7D, 0 ' switch to omni-mode ' parameter + value sysex for proteus SysEx hMidiO(0), CHR$(&HF0,&H18,4,Meq(0).ID,3,8,2,2,0,&HF7) END SUB SUB UpdateMonitor () EXPORT STATIC oldtempo AS INTEGER STATIC oldlevel AS INTEGER STATIC oldtuning AS INTEGER STATIC oldmapping AS INTEGER STATIC oldpatch AS INTEGER STATIC oldsens AS INTEGER STATIC oldsamplingrate AS INTEGER LOCAL m AS ASCIIZ * 20 IF ISFALSE Bom.hMonitor THEN ' create it... ' the data for this dialog has to be in the resource file!!! 'hDesktop = GetDesktopWindow ' Bom.hMonitor = DialogBox (hInst, "BOMPARAMDIALOG", %Null, CODEPTR(Bom_Monitor)) ' this function stops the complete multitasker!!!) ' Only Create... functions are allowable under !!!!!!!!!!! 'Bom.hMonitor = CreateDialogParam (hInst, "BOMPARAMDIALOG", %Null, CODEPTR(MonitorHandler),0) '09.11.1999: changed to Bom.hMonitor = CreateDialogParam (gh.InstDLL, "BOMPARAMDIALOG", %Null, App.MonitorCptr,0) ' note that App.MonitorCptr = GetProcAdress(gh.gInstDll,UCASE$("MonitorHandler")) m ="MM=" + STR$(App.tempo,4) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 0, m ' now doubled in cockpit oldtempo = App.tempo ' m = "SR=" + STR$(DAQparams.scanfreq,4) ' SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 1, m ' doubled in cockpit ' oldsamplingrate = DAQparams.scanfreq m = "Tuning =" + STR$(Bom.tuning) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 2, m oldtuning = Bom.tuning m = "Mapping=" + STR$(Bom.mapping) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 3, m oldmapping = Bom.mapping m = "Patch =" + STR$(Bom.subpatch) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 4, m oldpatch = Bom.subpatch m = "Sens =" + STR$(@sr.noise) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 5, m oldsens = @sr.noise CornerWindow Bom.hMonitor, "lr" END IF IF App.tempo <> oldtempo THEN m ="MM=" + STR$(INT(App.tempo)) 'SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID, m ' to be removed. - now gives initial tempo. SetDlgItemText gh.Cockpit,%GMT_TEMPO_ID, STR$(App.tempo) oldtempo = App.tempo END IF ' IF DAQparams.scanfreq <> oldsamplingrate THEN ' m = "SR=" + STR$(DAQparams.scanfreq,4) ' SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 1, m ' oldsamplingrate = DAQparams.scanfreq ' END IF IF Bom.tuning <> oldtuning THEN m = "Tuning =" + STR$(Bom.tuning) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 2, m oldtuning = Bom.tuning END IF IF Bom.mapping <> oldmapping THEN m = "Mapping=" + STR$(Bom.mapping) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 3, m oldmapping = Bom.mapping END IF IF Bom.subpatch <> oldpatch THEN m = "Patch =" + STR$(Bom.subpatch) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 4, m oldpatch = Bom.subpatch END IF IF @sr.noise <> oldsens THEN m = "Sens =" + STR$(@sr.noise) SetDlgItemText Bom.hMonitor, %GMT_TEXT0_ID + 5, m oldsens = @sr.noise END IF SetFocus gh.Cockpit ' this sets the focus to the first controll in the cockpit!!! END SUB SUB Bom_UpDown0_Handler () EXPORT ' this U/D controller increments/decrements the tempo variable with 5% STATIC oldval AS LONG STATIC tog AS BYTE IF ISFALSE tog THEN tog = %True oldval = UDCtrl(0).resetval END IF IF UDCtrl(0).value > oldval THEN App.Tempo = App.Tempo + (App.Tempo / 20) ELSE App.Tempo = App.Tempo - (App.Tempo / 20) END IF oldval = UDCtrl(0).value SetDlgItemText gh.Cockpit,%GMT_TEMPO_ID, STR$(App.tempo) 'UpdateMonitor END SUB SUB Bom_UpDown3_Handler () EXPORT ' this U/D controller increments/decrements the tempo variable with 50% STATIC oldval AS LONG STATIC tog AS BYTE IF ISFALSE tog THEN tog = %True oldval = UDCtrl(3).resetval END IF IF UDCtrl(3).value > oldval THEN App.Tempo = App.Tempo + (App.Tempo / 2) ELSE App.Tempo = App.Tempo - (App.Tempo / 2) END IF oldval = UDCtrl(3).value SetDlgItemText gh.Cockpit,%GMT_TEMPO_ID, STR$(App.tempo) 'UpdateMonitor END SUB SUB Bom_UpDown6_Handler () EXPORT ' this U/D controller doubles/halves the tempo STATIC oldval AS LONG STATIC tog AS BYTE IF ISFALSE tog THEN tog = %True oldval = UDCtrl(6).resetval END IF IF UDCtrl(6).value > oldval THEN App.Tempo = App.Tempo + App.Tempo ELSE App.Tempo = App.Tempo / 2 END IF oldval = UDCtrl(6).value SetDlgItemText gh.Cockpit,%GMT_TEMPO_ID, STR$(App.tempo) 'UpdateMonitor END SUB FUNCTION AkselPiek() EXPORT AS INTEGER ' returns a 7 bit bipolar value (-64--> + 63) ' used in & ' renewed 01.11.2003 LOCAL fmax2 AS INTEGER LOCAL fmax1 AS INTEGER LOCAL i AS DWORD LOCAL j AS DWORD LOCAL a AS INTEGER a = %False fmax1 = %False fmax2 = %False FOR i = 239 TO 255 ' 255- @sr.dT TO 255 fmax1 = MAX%(fmax1,DataBufC(i),DataBufD(i),DataBufE(i)) ' grootste positieve piek (versnelling) fmax2 = MIN%(fmax2,DataBufC(i),DataBufD(i),DataBufE(i)) ' grootste negatieve piek (vertraging) NEXT i IF fmax1 < %False THEN fmax1 = %False IF fmax2 > %False THEN fmax2 = %False IF fmax1 > ABS(fmax2) THEN a = fmax1 \ 32 ELSE a = fmax2 \ 32 ' negative! END IF FUNCTION = a END FUNCTION SUB SortSongbookDFT () EXPORT ' only used in Songbook LOCAL xi%, yi% ' deze sub sorteert de inhoud van het DFT! array (gevuld in DFTrans k%) ' naar afdalende orde van sterkte der berekende spektraalkomponenten. ' Nodige input: DFTarray(1 TO 32, 0 TO 1) ' De sterkste komponent staat nu op DFTarray(1,0) de sterkte is DFTarray(1,1) ' De sub funktioneert als een in-place funktie. Ze retourneert haar ' resultaat in hetzelfde 2-dimensioneel array dat erin wordt gestopt. FOR xi% = 1 TO UBOUND(DFTarray, 1) FOR yi% = 1 TO UBOUND(DFTarray, 1) - 1 IF DFTarray(yi%, 1) < DFTarray(yi% + 1, 1) THEN SWAP DFTarray(yi%, 1), DFTarray(yi% + 1, 1): SWAP DFTarray(yi%, 0), DFTarray(yi% + 1, 0) NEXT yi% NEXT xi% ' it would be faster to use PB's ARRAY SORT function. ' ARRAY SORT DFTarray(0,1), TAGARRAY DFTarray(0,0) DESCEND ' to be tested... END SUB ' ----------------- [EOF]