' *********************************************************************** ' * MIM.INC * ' * specific source code include for invisible instrument at the museum * ' * of musical instruments in Brussels. * ' *********************************************************************** ' 10.12.2001: code module split off and prepared for mim compilation. ' 20.01.2002: work session ' 18.02.2002: delivery testing. ' 15.04.2003: updated coding - gwr. ' 22.09.2003: checked again with dll changes. Adapted to new semantics for @sr.dT ' 14.07.2004: recompiled with new compiler version. ' 29.09.2006: updated with new nidaq drivers and tested- Xtof. ' 02.06.2009: lib metaconstant $added g_h_dll ' all declares are in gmt_bom.bi ' 'DECLARE CALLBACK FUNCTION CBPatch ' %mim_demotask = 15 GLOBAL hw AS DWORD #IF NOT %DEF($g_h_dll) #IF %DEF(%NiDAQ) $g_h_dll = "g_nih.dll" #ELSEIF %DEF(%g_NiDAQmx) $g_h_dll = "g_nxh.dll" #ELSE $g_h_dll = "g_noh.dll" #ENDIF #ENDIF GLOBAL cpPlace AS DWORD 'pointer for call dword to place GLOBAL cpTopo AS DWORD GLOBAL SonarOn AS LONG GLOBAL DopplerOn AS LONG GLOBAL pDoppler AS DWORD FUNCTION Init_Mim () AS DWORD ' MSGBOX FUNCNAME$ LOCAL CockpitLayo AS CockpitLabels LOCAL p AS DWORD ' msgbox funcname$ ' initialisation of globals for MIM (section copied from BOM-ini): DIM Notes(0 TO 40,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 40, 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 40, 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 LOCAL m AS ASCIIZ * 40 LOCAL i AS BYTE LOCAL j AS BYTE LOCAL cptr AS DWORD FUNCTION = %False IF ISFALSE hMidiO(0) THEN ErrorMidiOut : EXIT FUNCTION ' IF ISFALSE DAQparams.mode THEN EXIT FUNCTION 'conditions = %False ' must be set in Verify... (gmt_daq.bas) DAQparams.mode = %DAQ_NI ReadCockpitLabelsFromFile $MIMINI, CockpitLayo IF App.id <> %ID_II_MIM THEN MSGBOX "Initialisation error: wrong app.id",,"" EXIT FUNCTION ELSE Bom.hardware = %ii_2000 ' msgbox "read " + $MIMINI Mim_ReadIniFile $MIMINI ' reads bom.hardware for the computer running the program. ' also reads patches and note mappings. ' CheckDataArrays OK now END IF Task(0).naam = "" Task(0).cPtr = %False ' initialisation of tasks: Task(%Sonar_VU_Task).naam = "" ' 1 Task(%Sonar_VU_Task).cPtr = GetProcAddress(GetModuleHandle($g_h_dll),"SONAR_II_VU") Task(%Sonar_VU_Task).freq = 3 Task(%Sonar_VU_Task).flags = %DLL_TASK Task(%Sonar_Display_Task).naam = "" ' ! Task(%DopplerTetraDisplay).hparam Task(%Sonar_Display_Task).cPtr = CODEPTR (Mim_DrawTet) ' Task(%Sonar_Display_Task).cPtr = GetProcAddress(GetModuleHandle($g_h_dll),"SONAR_DISPLAY") Task(%Sonar_Display_Task).freq = 7 ' Task(%Sonar_Display_Task).flags = %DLL_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. Task(%Bom_PitchbendTask).flags = %HIDDEN_TASK Task(App.WriteSeqScoreTaskNr).cptr = %False Task(App.WriteSeqScoreTaskNr).naam = "" ' initialisation of tasks: Task(%Topoi).cPtr = CODEPTR(Mim_Topoi) Task(%Minor).cPtr = CODEPTR(Mim_Minor) Task(%Beat).cPtr = CODEPTR(Mim_Beat) Task(%Sforte).cPtr = CODEPTR(Mim_Sforte) Task(%Lead).cPtr = CODEPTR(Mim_Lead) Task(%Canvas).cPtr = CODEPTR(Mim_Canvas) 'Task(%Close).cPtr = CODEPTR(Sluit) '"Close" 'Task(%PrimeTime).cPtr = CODEPTR(Mim_PrimeTime) 'Task(%Call).cPtr = CODEPTR(Roep) '"Call" 'Task(%Spooky).cPtr = CODEPTR(Mim_Spooky) 'Task(%RecPlay).cPtr = CODEPTR(RecPlay) 'kl remark: ??geschikt voor mim? - delayed response.. 'Task(%LockUnlock).cPtr = CODEPTR(LockUnLock) 'kl: heel stil op pc soundcard... 'Task(%Hammers).cPtr = CODEPTR(Mim_Hammers) Task(%Solo).cPtr = CODEPTR(Mim_Solo) Task(%Drum).cPtr = CODEPTR(Mim_Drum) 'Task(%Edges).cPtr = CODEPTR(Mim_Edges) ' Task(%Tance).cPtr = CODEPTR(Mim_Tance) 'Task(%Stresso).cPtr = CODEPTR(Stresso) ' not suitable for mim 'Task(%Jogyaka).cPtr = CODEPTR(Jogyaka) 'Task(%Tempi).cPtr = CODEPTR(Tempi) Task(%simple).cptr = CODEPTR(Mim_Simple) Task(%triple).cptr = CODEPTR(Mim_Triple) Task(%triple).channel = 0 Task(%triple1).cptr = CODEPTR(Mim_Triple1) TaskEx(%triple).stopcptr = CODEPTR(Triple_Stop) Task(%triple1).naam = "triple1" Task(%triple1).channel = 1 TaskEx(%triple1).stopcptr = CODEPTR(Triple_Stop) Task(%triple2).cptr = CODEPTR(Mim_Triple2) Task(%triple2).naam = "triple2" Task(%triple2).channel = 2 TaskEx(%triple2).stopcptr = CODEPTR(Triple_Stop) Task(%mim_demotask).naam = "Demo" Task(%mim_demotask).freq = 5 Task(%mim_demotask).cptr = CODEPTR(Mim_demo) '20080327 although the following tasks where here, they where not used for mim - don't show up as there's no correspondent field in mim.cfg ' remmed here now to make room for new tasks.. ' Task(%Vox_0).naam = "-K0" ' = 38 ' Task(%Vox_0).cPtr = CODEPTR(Mim_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_0).flags = %HIDDEN_TASK ' Task(%Vox_1).naam = "-K1" ' Task(%Vox_1).cPtr = CODEPTR(Mim_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_1).flags = %HIDDEN_TASK ' Task(%Vox_2).naam = "-K2" ' Task(%Vox_2).cPtr = CODEPTR(Mim_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_2).flags = %HIDDEN_TASK ' 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_3).flags = %HIDDEN_TASK ' Task(%Vox_4).naam = "-K4" ' Task(%Vox_4).cPtr = CODEPTR(Mim_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_4).flags = %HIDDEN_TASK ' 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_5).flags = %HIDDEN_TASK ' 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(%Vox_6).flags = %HIDDEN_TASK Bom.algo = %False ' override settings from InitGlobalVariables in main module: App.GlobalHarmonyTaskNr = 15 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 Mim_RemapCockpitButtons ' only changes contents of arrays. - o.k. Bom_RemapUpDowns ' adapt the function of the function keys and reorient the handler: ' Bom_RemapFunctionKeys ' the finalisation of the new cockpit will be handled in UpdateCockpit. ' 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 Holosound:" SendMessage gh.Cockpit, %WM_SETTEXT,0, VARPTR(m) ' add labels to the sliders in the cockpit: SetDlgItemText gh.Cockpit,%GMT_TEXT_SLIDER0, "@1" & CHR$(0) SetDlgItemText gh.CockPit,%GMT_TEXT_SLIDER1, "@2" & CHR$(0) ' Initialize data acquisition hardware: ' new: '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) DIM DataBuf5(255) AS GLOBAL INTEGER AT @sr.pb(5) DIM DataBuf6(255) AS GLOBAL INTEGER AT @sr.pb(6) DIM DataBuf7(255) AS GLOBAL INTEGER AT @sr.pb(7) DIM DataBuf8(255) AS GLOBAL INTEGER AT @sr.pb(8) DIM DataBuf9(255) AS GLOBAL INTEGER AT @sr.pb(9) DIM DataBufA(255) AS GLOBAL INTEGER AT @sr.pb(10) DIM DataBufB(255) AS GLOBAL INTEGER AT @sr.pb(11) DIM DataBufC(255) AS GLOBAL INTEGER AT @sr.pb(12) DIM DataBufD(255) AS GLOBAL INTEGER AT @sr.pb(13) DIM DataBufE(255) AS GLOBAL INTEGER AT @sr.pb(14) DIM DataBufF(255) AS GLOBAL INTEGER AT @sr.pb(15) 'i = Sonar_DAQ (%DAQ_DOUBLEBUFFER) ' App.Padr = &H1100 ' set to Bom99 display and NiDAQ-P port, so that we do not crash under NT ' ' ' LOCAL hW AS LONG ' DIALOG NEW 0, "patch",,,80,50 TO hW ' CONTROL ADD TEXTBOX, hw, 1, "0",5,5,70, 12 ' CONTROL ADD LABEL, hw, 2, "0", 5,20,70,12 ' CONTROL ADD BUTTON, hw, 3, "change",5,35, 70, 12 CALL CBPatch ' DIALOG SHOW MODELESS hW ' ' '*** nieuw voor namuda ondersteuning cptr = GetProcAddress(gh.gnh, "GETDOPPLERPOINTER") CALL DWORD cptr USING GetDopplerPointer TO p pDoppler = p Create_Doppler_Control_Task BYVAL pDoppler, Slider(), UDctrl() ' in g_main.inc, g_lib.dll Task(%DopplerTetraControl).naam = "D-Ctrl" ShowWindow Task(%DopplerTetraControl).hParam, %SW_HIDE Task(%DopplerTetraDisplay).naam = "Doppler" ' 6 Task(%DopplerTetraDisplay).cPtr = GetProcAddress(gh.gnh,"DOPPLER_TETRAHEDRON_DISPLAY") ' in g_n*h.dll Task(%DopplerTetraDisplay).freq = 16 '24 ' Task(%DopplerTetraDisplay).flags = %DLL_TASK OR %PERTIM_TASK Task(%DopplerTetraDisplay).patch = %False '**** StartSonarDaq 'StartDopplerDaq cpPlace = GetProcAddress(gh.gnh, "PLACE") cpTopo = GetPRocAddress(gh.gnh, "TOPO") FUNCTION = %True END FUNCTION FUNCTION StartSonarDaq AS LONG LOCAL cptr AS DWORD LOCAL i AS LONG cptr = GetProcAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ (%DAQ_DOUBLEBUFFER) TO i SonarOn = 1 END FUNCTION FUNCTION StopSonarDaq AS LONG LOCAL cptr AS DWORD LOCAL i AS LONG cptr = GetProcAddress(gh.gnh, "SONAR_DAQ") CALL DWORD cptr USING Sonar_DAQ (0) TO i END FUNCTION 'BELOW ARE DIRECT COPIES FROM NAMUDA.INC - TO BE ADAPTED!!!!! FUNCTION StartDopplerDAQ () AS LONG STATIC cptr AS DWORD cptr = GetProcAddress(gh.gnh, "DOPPLER_DAQ") MSGBOX "dopplerdaq ptr" + STR$(cptr) CALL DWORD cptr USING Doppler_DAQ(%DAQ_DOUBLEBUFFER) SLEEP 100 '? this may help to avoid the crashes on \\Xi SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(DAQparams.samplingrate(8),4) '+ "S/s" SLEEP 10 MSGBOX "about to show window" ShowWindow Task(%DopplerTetraControl).hParam, %SW_SHOW SLEEP 10 MSGBOX "k" ' MSGBOX "pre display..",,FUNCNAME$ IF ISFALSE Task(%DopplerTetraDisplay).swit THEN Starttask %DopplerTetraDisplay 'see what happens if we omit this.. SLEEP 20 Doppleron = 1 MSGBOX FUNCNAME$ + "done" END FUNCTION FUNCTION StopDopplerDAQ () AS LONG ' this should switch off the DAQ function STATIC cptr AS DWORD IF ISFALSE DAQparams.daqstopped THEN cptr = GetProcAddress(gh.gnh, "DOPPLER_DAQ") CALL DWORD cptr USING Doppler_DAQ(%False) END IF SetDlgItemText gh.Cockpit, %GMT_TEXT_SR, STR$(%False) '+ "S/s" Showwindow Task(%DopplerTetraControl).hParam, %SW_HIDE IF Task(%DopplerTetraDisplay).swit THEN stoptask %DopplerTetraDisplay Doppleron = 0 END FUNCTION '' 'CALLBACK FUNCTION CBPatch ' LOCAL buf$ ' LOCAL patch AS BYTE ' LOCAL i AS LONG ' IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION ' CONTROL GET TEXT CBHNDL,1 TO buf$ ' patch = VAL(buf$) ' 'ProteusPatch Meq(0), 0, patch ' 'ProteusPatch Meq(0), 1, patch ' 'ProteusPatch Meq(0), 2, patch ' 'ProteusPatch Meq(0), 3, patch ' 'ProteusPatch Meq(0), 4, patch ' 'ProteusPatch Meq(0), 5, patch ' FOR i = 0 TO 15 ' ProgChange i, patch ' NEXT ' CONTROL SET TEXT CBHNDL, 2, STR$(patch) 'END FUNCTION ' SUB Mim_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 GetComputerName mpName,SIZEOF(mpName) ' WinApi function szTitelBox = "" fnr = OPENFILE (filenaam,buffer,%OF_EXIST) IF fnr <> %True THEN m = "No configuration file found..." + CHR$(13) m = m + filenaam + "has to be in the specified directory!" + CHR$(13) MessageBox gh.Inst,m, szTitelbox,%MB_OK OR %MB_ICONSTOP OR %MB_TASKMODAL OR %MB_TOPMOST EXIT SUB END IF ' here we read the MIM-ini file fnr = FREEFILE OPEN filenaam FOR INPUT AS #fnr DO UNTIL EOF(fnr) INPUT# fnr, dummy$ SELECT CASE TRIM$(UCASE$(dummy$)) CASE "SLIDERS" INPUT# fnr, aantal 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$) CASE 39 'nieuwe MIM taken 20080327 Task(%Simple).naam = MCASE$(a$) CASE 40 Task(%triple).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]" END SELECT LOOP CLOSE #fnr END SUB SUB Mim_Topoi () EXPORT LOCAL t AS DWORD LOCAL m AS WORD STATIC xh%,yh%,zh% 'STATIC Jumpval AS BYTE STATIC no() AS BYTE STATIC t() AS SINGLE 'time since note on, 0 when is note off, new kl 020208 STATIC oldtopo AS BYTE LOCAL volume AS WORD LOCAL xa%,ya%,za% LOCAL sig! LOCAL kanaal AS LONG IF ISFALSE Task(%Topoi).tog THEN Bom.mapping=0 Bom.algo = 2 @sr.noise = 0 Bom.tog = %False Task(%Topoi).tog = %True REDIM no(0 TO 15) AS STATIC BYTE REDIM t(0 TO 15) AS STATIC SINGLE App.tempo = 500 ' was 600 @020208 ' origineel tempo van de Multitrax versie uit 1992 Task(%Topoi).freq = App.tempo / 60! @sr.ascale = 1 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 ' logfile FUNCNAME$ Task(%Topoi).freq = App.tempo / 60! t = UBOUND(Databuf3) ' notes 0ff on small movement code: IF Bom.Mapping = oldtopo THEN ' logfile "mapping = old topo" ' window for small movement: IF DataBuf3(t) > 32 THEN ' ' trigval to be experimentally tested. ' 32 equals 1 bit if we have 7 bit resolution. (VU display shows 8 bit) IF DataBuf3(t) < 1024 THEN FOR kanaal = 0 TO 15 ' was 7 IF no(kanaal) THEN NoteOff Task(%Topoi).channel + kanaal, no(kanaal) no(kanaal) = %False t(kanaal) = %False END IF NEXT kanaal END IF END IF EXIT SUB END IF ' --------------------------------- volume = DataBuf3(t) ' 'AvgStatArr (DataBuf7(), sig!,Daqparams.scanfreq) SHIFT RIGHT volume, 5 ' 0-127 FOR kanaal = 0 TO 7 n(kanaal) = Notes(Bom.algo, Bom.mapping, kanaal) ' logfile STR$(kanaal) + STR$(n(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% = DataBufC(t)\ 64 IF xa% > 15 THEN xa% = 15 IF xa% < -16 THEN xa% = -16 m = AvgStatArr (DataBuf0(), sig!,Daqparams.scanfreq \2) SHIFT RIGHT m,8 n(kanaal) = (m * 7) + xa% CASE 1 ya% = DataBufD(t) \ 64 IF ya% > 15 THEN ya% = 15 IF ya% < -16 THEN ya% = -16 m = AvgStatArr (DataBuf1(), sig!,Daqparams.scanfreq \2) SHIFT RIGHT m,8 n(kanaal) = (m * 7) + ya% CASE 2 za% = DataBufE(t) \ 64 IF za% > 15 THEN za% = 15 IF za% < -16 THEN za% = -16 m = AvgStatArr (DataBuf2(), sig!,Daqparams.scanfreq \2) SHIFT RIGHT m,8 n(kanaal) = (m * 7) + za% END SELECT END IF END IF IF n(kanaal) < 36 THEN n(kanaal) = %False: v(kanaal) = %False ' logfile " " + STR$(n(kanaal)) + STR$(no(kanaal)) + STR$(volume) IF n(kanaal) <> no(kanaal) THEN IF no(kanaal) > %False THEN ' here we can try to let notes hang... IF ISFALSE n(kanaal) THEN ' laat noten hangen ELSE NoteOff Task(%Topoi).channel + kanaal, no(kanaal) no(kanaal) = %False t(kanaal) = %false END IF END IF IF n(kanaal)> %False THEN IF volume > %False THEN mPlay Task(%Topoi).channel + kanaal, n(kanaal), volume ' logfile FUNCNAME$ + " play" + STR$(Task(%Topoi).channel + kanaal) + STR$(n(kanaal)) + STR$( volume) no(kanaal) = n(kanaal) t(kanaal) = TIMER END IF END IF END IF NEXT kanaal FOR kanaal = LBOUND(t) TO UBOUND(t) 'put off notes that are on for longer then 30" IF t(kanaal) AND TIMER > (t(kanaal) + 30) THEN NoteOff Task(%Topoi).channel + kanaal, no(kanaal) no(kanaal) = %false t(kanaal) = %false END IF NEXT END SUB SUB Mim_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 ' 120 'App.tempo = 40 ' bom96 Task(%Minor).freq = App.tempo / 60! ' controls: mapping MakeTaskUnique %Minor 'Task(%DAQ_TASK).channel = %DAQ_S07_M8F 'StartTask %DAQ_TASK END IF t = UBOUND(DatabufF) DIM AD(0 TO 15) AS LOCAL INTEGER IF DataBufB(t) =< @sr.noise THEN Task(%Minor).freq = DAQparams.samplingrate(0) / 3 ' such that it reacts fast! EXIT SUB END IF AD(7) = DataBuf7(t) SHIFT RIGHT AD(7), 9 AD(7) = 36 + (12* AD(7)) ' oktaafligging IF AD(7) > 72 THEN AD(7) = 72 IF AD(7) < 36 THEN AD(7) = 36 DIM ADL(0 TO 15) AS LOCAL INTEGER IF Databuf8(t) > %False THEN ADL(8) = INT(15.268 * LOG(Databuf8(t))) ELSE ADL(8)=%False IF DataBuf9(t) > %False THEN ADL(9) = INT(15.268 * LOG(Databuf9(t))) ELSE ADL(9)=%False IF DataBufA(t) > %False THEN ADL(10) = INT(15.268 * LOG(DatabufA(t))) ELSE ADL(10)=%False IF DataBuf3(t) > %False THEN ADL(3) = INT(15.268 * LOG(Databuf3(t))) ELSE ADL(3)=%False IF DataBuf4(t) > %False THEN ADL(4) = INT(15.268 * LOG(Databuf4(t))) ELSE ADL(4)=%False IF DataBuf5(t) > %False THEN ADL(5) = INT(15.268 * LOG(Databuf5(t))) ELSE ADL(5)=%False IF DataBuf6(t) > %False THEN ADL(6) = INT(15.268 * LOG(Databuf6(t))) ELSE ADL(6)=%False IF DataBufF(t) <> %False THEN 'ADL(15) = INT(8.38 * LOG(ABS(DataBufF(t)\2))) * SGN(DataBufF(t)) ADL(15) = INT((15.268 * LOG(ABS(DatabufF(t)))) * SGN(DataBufF(t))) ' 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 Mim_Beat () EXPORT STATIC Jumpval AS BYTE STATIC l% STATIC AD() AS INTEGER LOCAL t AS DWORD IF Task(%Beat).tog = %False THEN Task(%Beat).tog = %True @sr.noise = 1 '3 ' as in Bom96 REDIM AD(0 TO 15) AS STATIC INTEGER Bom.algo = 4 Jumpval = %False ' @sr.dT = 5 '64 ' in ms 'Bom.aScale = 64 @sr.ascale = 2 MakeTaskUnique %Beat App.tempo = 240 Task(%Beat).freq = App.tempo / 60! END IF t = UBOUND(DataBuf0) SELECT CASE Jumpval CASE %False AD(11) = DataBufB(t) SHIFT RIGHT AD(11),5 IF AD(11) < @sr.noise THEN EXIT SUB AD(0) = DataBuf0(t) SHIFT RIGHT AD(0), 5 '0-127 AD(7) = DataBuf7(t) SHIFT RIGHT AD(7),9 ' 3 bits; 0-7 - velocity INCR AD(7) ' 1 - 8 - bepalend voor tempo. AD(12) = @sr.xac \ 32 'DataBufC(t) ' 13 bits bipolar! - accelleration X channel. -4096 - + 4095 'AD(12) = AD(12) \ Bom.aScale ' -64 -> + 64 met Bom.ascale = 64 'IF AD(12) > 63 THEN AD(12) = 63 'IF AD(12) <-63 THEN AD(12) = -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) = SQR(AD(0)/127) * 127 'was AD(0) @ 020208 IF v(0) > %False THEN mPlay Task(%Beat).channel,n(0), v(0) Task(%Beat).freq = (App.tempo * AD(7))/60! ' 16Hz tot 128Hz END IF EXIT SUB CASE 1 AD(1) = DataBuf1(t) SHIFT RIGHT AD(1),5 '0-127 IF AD(1) > 127 THEN AD(1) = 127 AD(13) = @sr.yac \ 32 'DataBufD(t) 'AD(13) = AD(13) \ Bom.aScale 'IF AD(13) > 63 THEN AD(13)=63 'IF AD(13) < -63 THEN AD(13) = -63 Jumpval = 2 IF ABS(AD(13)) > @sr.noise AND (AD(1) > @sr.noise + @sr.noise + 1) THEN n(1) = 64 + AD(13) v(1) = SQR(AD(1)/127) *127 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) = DataBuf2(t) SHIFT RIGHT AD(2),5 '0-127 IF AD(2) > 127 THEN AD(2) = 127 AD(14) = @sr.zac / 32 'DataBufE(t) 'AD(14) = AD(14) \ Bom.aScale 'IF AD(14) > 63 THEN AD(14)=63 'IF AD(14) < -63 THEN AD(14) = -63 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) = DataBuf3(t) l% = DataBuf7(t) 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) ' Uit &H96: Uit (ADC%(7)): Uit ((ADC%(3)) OR 64) EXIT SUB END IF AD(0) = DataBuf0(t) SHIFT RIGHT AD(0),6 AD(1) = DataBuf1(t) SHIFT RIGHT AD(1),6 ' o-63 AD(2) = DataBuf2(t) SHIFT RIGHT AD(2),6 IF (AD(0) > 16) AND (AD(1) > 16) THEN n(3) = INT(15.268 * LOG(DataBuf8(t))) IF v(0) THEN mPlay Task(%Beat).channel + 3, n(3) , v(0) n(4) = INT(15.268 * LOG(DataBuf9(t))) IF v(1) THEN mPlay Task(%Beat).channel + 4, n(4) , v(1) ELSEIF (AD(0) > 16) AND (AD(2) > 16) THEN n(3) = INT(15.268 * LOG(DataBuf8(t))) IF v(0) THEN mPlay Task(%Beat).channel + 3, n(3), v(0) n(5) = INT(15.268 * LOG(DataBufA(t))) IF v(2) THEN mPlay Task(%Beat).channel + 5, n(5), v(2) ELSEIF (AD(1) > 16) AND (AD(2) > 16) THEN n(4) = INT(15.268 * LOG(DataBuf9(t))) IF v(1) THEN mPlay Task(%Beat).channel + 4, n(4), v(1) n(5) = INT(15.268 * LOG(DataBufA(t))) IF v(2) THEN mPlay Task(%Beat).channel + 5, n(5), v(2) END IF IF (AD(0) + AD(1) + AD(2)) > 120 THEN l% = DataBuf3(t) 'AD(3) 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 Mim_Sforte () EXPORT ' werkt perfekt. LOCAL t AS DWORD 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 t = UBOUND(DataBuf0) DIM AD(0 TO 6) AS LOCAL INTEGER AD(0) = DataBuf0(t) SHIFT RIGHT AD(0), 5 ' res 7 AD(1) = DataBuf1(t) SHIFT RIGHT AD(1), 5 AD(2) = DataBuf2(t) SHIFT RIGHT AD(2), 5 AD(3) = DataBuf3(t) 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)= DataBuf4(t) SHIFT RIGHT AD(4), 7 ' 5 bit AD(5) = DataBuf5(t) SHIFT RIGHT AD(5), 7 AD(6) = DataBuf6(t) 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 Mim_Lead () EXPORT ' translated 10.07.1999 / debugged 28.07.1999 STATIC JumpVal AS BYTE STATIC LeadDone AS BYTE STATIC tl AS DWORD LOCAL kanaal AS BYTE STATIC no() AS BYTE STATIC tno() AS SINGLE LOCAL volume AS WORD LOCAL m AS ASCIIZ * 30 LOCAL t AS DWORD IF Task(%Lead).tog = %False THEN REDIM no(0 TO 15) AS STATIC BYTE REDIM tno(0 TO 15) AS STATIC SINGLE 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 FOR kanaal = 0 TO 5 'avoid hanging notes IF tno(kanaal) AND TIMER > (tno(kanaal) + 10) THEN 'only happens when one is standing still NoteOff Task(%Lead).channel + kanaal, no(kanaal) no(kanaal) = %false tno(kanaal) = %false END IF NEXT 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 t = UBOUND(DataBuf0) SELECT CASE JumpVal CASE 0 ' eigenlijke lead-kode: - DAQ used Task1, translated as: DIM AD(0 TO 7) AS LOCAL INTEGER AD(0) = DataBuf0(t) SHIFT RIGHT AD(0),5 AD(1) = DataBuf1(t) SHIFT RIGHT AD(1),5 AD(2) = DataBuf2(t) SHIFT RIGHT AD(2),5 AD(3) = DataBuf3(t) SHIFT RIGHT AD(3),8 ' 0-15 SHIFT LEFT AD(3),3 ' 0-120 AD(4) = DataBuf4(t) SHIFT RIGHT AD(4),5 AD(5) = DataBuf5(t) SHIFT RIGHT AD(5),5 AD(6) = DataBuf6(t) 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(DataBuf3(t) * DataBuf7(t)) ' 0-4095 SHIFT RIGHT volume, 5 ' better curve , 11.08.1999 FOR kanaal = 0 TO 5 IF no(kanaal) THEN NoteOff Task(%Lead).channel + kanaal, no(kanaal) no(kanaal) = %false tno(kanaal) = %false END IF mPlay Task(%Lead).channel + kanaal, n(kanaal), volume no(kanaal) = n(kanaal) tno(kanaal) = TIMER 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 IF no(kanaal) THEN NoteOff Task(%Lead).channel + kanaal, no(kanaal) no(kanaal) = %false tno(kanaal) = %false END IF mPlay Task(%Lead).channel + kanaal,Notes(Bom.algo,2,kanaal), 127 no(kanaal) = Notes(Bom.algo,2,kanaal) 'n(kanaal) tno(kanaal) = TIMER NEXT kanaal tl = timeGetTime + 10000 Task(%Lead).freq = 17 JumpVal = 2 EXIT SUB CASE 2 'volume-kontrole slotakkoord: IF timeGetTime < tl THEN volume = SQR(DataBuf3(t) * DataBuf7(t)) 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 Mim_Canvas () EXPORT STATIC Jumpval AS BYTE STATIC tc& STATIC no() AS BYTE STATIC tno () AS SINGLE LOCAL x AS INTEGER,y AS INTEGER ,z AS INTEGER ,xyz AS INTEGER LOCAL dummy AS INTEGER LOCAL t AS DWORD LOCAL kanaal AS BYTE IF ISFALSE Task(%Canvas).tog THEN REDIM no(0 TO 15) AS STATIC BYTE REDIM tno(0 TO 15) AS STATIC SINGLE Task(%Canvas).tog = %True Task(%Canvas).channel = %False Bom.algo = 8 Bom.mapping = 0 Bom.subpatch = 0 Jumpval = %False App.tempo = 480 '120 ' originally expressed as period duration in cs. [ =50cs = 2Hz = MM120 ] Task(%Canvas).freq = App.Tempo / 60! @sr.noise = 1 MakeTaskUnique %Canvas END IF FOR kanaal = 0 TO 15 'avoid hanging notes IF tno(kanaal) AND TIMER > (tno(kanaal) + 20) THEN NoteOff Task(%Lead).channel + kanaal, no(kanaal) no(kanaal) = %false tno(kanaal) = %false END IF NEXT DIM AD(0 TO 7) AS LOCAL INTEGER t = UBOUND(DataBuf0) SELECT CASE Jumpval CASE %False AD(0) = DataBuf0(t) AD(1) = DataBuf1(t) AD(2) = DataBuf2(t) AD(3) = DataBuf3(t) AD(4) = DataBuf4(t) AD(5) = DataBuf5(t) AD(6) = DataBuf6(t) FOR dummy = 0 TO 6 SHIFT RIGHT AD(dummy),5 NEXT dummy x = AD(0) IF x > 36 AND x < 96 THEN IF no(0) THEN NoteOff Task(%canvas).channel, no(0) no(0) = %false: tno(0) = 0 END IF mPlay Task(%Canvas).channel, x + 30, 127 no(0) = x + 30:tno(0) = TIMER END IF y = AD(1) IF y > 36 AND y < 96 THEN IF no(2) THEN NoteOff Task(%canvas).channel + 2, no(2) no(2) = %false: tno(2) = 0 END IF mPlay Task(%Canvas).channel + 2, y+30, 127 no(2) = y + 30: tno(2) = TIMER END IF z = AD(2) IF z > 36 AND z < 96 THEN IF no(1) THEN NoteOff Task(%canvas).channel + 1, no(1) no(1) = %false: tno(1) = 0 END IF mPlay Task(%Canvas).channel + 1, z+30, 127 no(1) = z + 30: tno(1) = TIMER END IF xyz = AD(3) IF x > 10 AND x < 36 THEN IF no(3) THEN NoteOff Task(%canvas).channel + 3, no(3) no(3) = %false: tno(3) = 0 END IF mPlay Task(%Canvas).channel + 3, x+36, xyz OR 64 no(3) = x + 36: tno(3) = TIMER END IF IF x > 64 THEN IF no(4) THEN NoteOff Task(%canvas).channel + 4, no(4) no(4) = %false: tno(4) = 0 END IF mPlay Task(%Canvas).channel + 4 , x, 127 no(4) = x: tno(4) = TIMER END IF IF y > 64 THEN IF no(5) THEN NoteOff Task(%canvas).channel + 5, no(5) no(5) = %false: tno(5) = 0 END IF mPlay Task(%Canvas).channel + 5 , y , 127 no(5) = y: tno(5) = TIMER END IF IF y > 10 AND y < 36 THEN IF no(6) THEN NoteOff Task(%canvas).channel + 6, no(6) no(6) = %false: tno(6) = 0 END IF mPlay Task(%Canvas).channel + 6, y+36, xyz OR 64 no(6) = y: tno(6) = TIMER END IF IF z > 64 THEN IF no(7) THEN NoteOff Task(%canvas).channel + 7, no(7) no(7) = %false: tno(7) = 0 END IF mPlay Task(%Canvas).channel + 7 , z, 127 no(7) = z: tno(7) = TIMER END IF 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) = DataBuf0(t) AD(1) = DataBuf1(t) AD(2) = DataBuf2(t) AD(3) = DataBuf3(t) 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 Mim_Primetime () EXPORT LOCAL oldtempo AS INTEGER LOCAL t AS DWORD 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.dT = 8 '64 ' Bom.aScale = 100 ' was @128 020208 ' scaling for acceleration using up-down 12 @sr.ascale = 2 MakeTaskUnique %PrimeTime ' following tasknumbers should be made relative: 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 ' komt onder de groupbox Awaiting / Expecting ' Bom.dSamp = SampTim2NrSamp(@sr.dT, DAQparams.scanfreq) 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 * 17) Task(%PrimeTime).freq = App.tempo / 60! oldtempo = App.tempo UpdateMonitor END IF DIM AD(0 TO 15) AS INTEGER t = UBOUND(DataBuf0) AD(0) = DataBuf0(t) AD(1) = DataBuf1(t) AD(2) = DataBuf2(t) AD(3) = DataBuf3(t) AD(12) = DataBufC(t) AD(13) = DataBufD(t) AD(14) = DataBufE(t) AD(15) = DataBufF(t) 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) App.Tempo = (7 * App.Tempo + 200 + 3 * AD(i)) / 8 'new krl 020208 ' CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(App.Tempo) ' CASE 12, 13, 14 AD(i) = AD(i)\ 32 'Bom.aScale ' -64 -> + 63 ' depends on operational mode for of DAQ_Task !! 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 'Bom.aScale 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 Mim_Spooky () EXPORT ' needs 3 other tasks to play!!! LOCAL il AS BYTE LOCAL t AS DWORD IF Task(%Spooky).tog = %False THEN Bom.algo = 12 @sr.noise= 4 App.tempo = 100 '120 '180 'kl 020215 Task(%Spooky).freq = App.tempo / 60! Task(%Spooky).tog = %True Task(%Spooky).channel = %False MakeTaskUnique %Spooky ' Task(%DAQ_TASK).channel = %DAQ_S07 ' StartTask %DAQ_TASK ' 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 t = UBOUND(DataBuf0) AD(0) = DataBuf0(t) AD(1) = DataBuf1(t) AD(2) = DataBuf2(t) AD(3) = DataBuf3(t) AD(4) = DataBuf4(t) AD(5) = DataBuf5(t) AD(6) = DataBuf6(t) 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 IF v(1) THEN v(1) = 63 + 64 * SQR(v(1) / 127) IF v(2) THEN v(2) = 95 + 32 * SQR(v(2) / 127) 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 Mim_Hammers () EXPORT LOCAL adval AS INTEGER LOCAL t AS DWORD 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! ' 20Hz = original value from MT44 code.(1992) ' @sr.dT = 6 '50 ' Bom.aScale = 128 ' Timeframe = 50 '500 ' ms timeframe for acceleration measurement. ' NrSamp = Timeframe / (1000!/DAQparams.scanfreq) ' INCR NrSamp @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) 'MT44 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! t = UBOUND(Databuf0,1) n = DataBuf0(t) SHIFT RIGHT n,5 v(0) = n n = DataBuf1(t) SHIFT RIGHT n,5 v(1) = n v(1) = 127 * SQR(v(1)/127) n = Databuf2(t) SHIFT RIGHT n,5 v(2) = n n = DataBuf3(t) ' dit was in MT44: v(3) = 10 bit data / 3, limited to 127. SHIFT RIGHT n,2 IF n > 127 THEN n = 127 v(3) = n n = DataBuf4(t) SHIFT RIGHT n,9 '0-7 n(0) = n * 12 '0-84 n = DataBuf5(t) SHIFT RIGHT n,9 n(1) = n * 12 n = DataBuf6(t) 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 = DataBufC(t) \ 32 'bom.aScale 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 = DataBufD(t) \ 32 'Bom.aScale 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 = DataBufE(t) \ 32 'Bom.aScale 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)/2 '4 'v(0)/2 ' MT44 code END IF ELSEIF ISFALSE MAX(n(0), n(1), n(2)) THEN n(4) = %false n(5) = %false END IF END SUB SUB Mim_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% LOCAL t AS LONG IF ISFALSE Task(%Solo).tog THEN @sr.noise = 5 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. ' translation to GMT started 30.06.1999 / rev. 07.07.1999 / 26.07.1999 /15.11.2000 / 10.12.2000 Task(%Solo).freq = App.tempo / 60! jl% = @sr.xyzf ' 0 - 4095 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(ABS(@sr.xyze)) ' 0 - 256 il% = @sr.xyze / 32 ' 0- 127 velo = @sr.xyza SHIFT RIGHT velo,5 ' 0-127 was 4 ' 0 - 256 - 8 bits velo= velo + il% ' nu 0-255 '0 - 512 IF velo > 127 THEN velo = 127 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 Mim_Simple 'hoe werkt de bm.mapping toestand? '-> mim.cfg bevat blijkbaar controllers en patches voor verschillende stukken ('CC,' en 'PATCH,') - ook andere algo params (toonladders?) '-> wordt geparst door mim_readinifile: patch en data gaan in Patch(bom.algo, subpatch, n%) en Notes() - CC's worden nergens ingelezen?? ' ?? komt elke Bom.algo overeen met een task? meestal, maar tasknr niet gelijk aan algo nr - juiste verhouding tss de twee gechecked door MakeTaskUnique!!! ' ?? waar worden die patches dan verstuurd? MakeTaskUnique(@bom.inc)->ProtPat 'TO BE TESTED - hheft xi interne klankkaart? -> j, wavemapper werkt op m-audio STATIC note AS CURRENCY LOCAL velo AS BYTE IF ISFALSE Task(%Simple).tog THEN @sr.noise = 3 Bom.algo = 39 Bom.mapping = 0 '?? waarom verandert patch na andere taak te spelen (houdt niet gewoon patch van de vorige taak, maar selecteert zelf een andere dan normaal) Bom.SubPatch = 0 MakeTaskUnique %simple END IF 'nieuw 2008 op vraag van MIM naar stukken met directere reaxie IF @sr.xyze/32 < @sr.noise * 2 THEN Task(%simple).freq = 32 EXIT SUB END IF IF Task(%simple).freq >= 31 THEN Task(%simple).freq = 4 + @sr.xyzf/512 'na een stilte, momentane waarde nemen ELSE 'beetje integreren Task(%simple).freq = MIN(30, (2 * Task(%simple).freq + 4 + 30 * SQR(@sr.xyzf/2048))/3) '4->20 END IF IF (@sr.xyza < @sr.noise) AND (note > 0) THEN mPlay Task(%Simple).channel, note, 0 note = 0 END IF mPlay Task(%Simple).channel, note, 0 note = 36 + 48 * ((@sr.xyzf) / 2048) ^ 2 velo = MIN(127, 10 + 117 * @sr.xyza/2048) mPlay Task(%simple).channel, note, velo CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(note) + STR$(velo) 'mssch nog iets met de panning doen?? END SUB 'volgende drie dienen om samen te gebruiken: zoals simple, maar elk op 1 vector SUB Mim_Triple STATIC note AS CURRENCY LOCAL velo AS BYTE IF ISFALSE Task(%Triple).tog THEN @sr.noise = 3 Bom.algo = 40 Bom.mapping = 0 '?? waarom verandert patch na andere taak te spelen (houdt niet gewoon patch van de vorige taak, maar selecteert zelf een andere dan normaal) Bom.SubPAtch = 0 MakeTaskUnique %triple controller Task(%triple).channel, 10, 20 controller Task(%triple1).channel, 10, 64 controller Task(%triple2).channel, 10, 107 Task(%triple).tog = 1 StartTask %triple1 StartTask %triple2 END IF 'nieuw 2008 op vraag van MIM naar stukken met directere reaxie IF @sr.xe/32 < @sr.noise * 2 THEN IF note > 0 THEN mPlay Task(%Triple).channel, note, 0 note = 0 END IF Task(%triple).freq = 32 EXIT SUB END IF IF Task(%triple).freq >= 31 THEN Task(%triple).freq = MIN(30, 4 + @sr.xf/1024) 'na een stilte, momentane waarde nemen ELSE 'beetje integreren Task(%triple).freq = MIN(30, (2 * Task(%triple).freq + 4 + 30 * SQR(@sr.xf/4096))/3) '4->20 END IF IF (@sr.xa < @sr.noise) AND (note > 0) THEN mPlay Task(%Triple).channel, note, 0 note = 0 END IF mPlay Task(%Triple).channel, note, 0 note = 36 + 48 * ((@sr.xf) / 2048) ^ 2 velo = MIN(127, 10 + 117 * @sr.xa/2048) mPlay Task(%triple).channel, note, velo 'mssch nog iets met de panning doen?? END SUB SUB Mim_Triple1 STATIC note AS CURRENCY LOCAL velo AS BYTE IF ISFALSE Task(%Triple1).tog THEN IF ISFALSE Task(%triple).tog THEN StartTask %triple: EXIT SUB END IF 'nieuw 2008 op vraag van MIM naar stukken met directere reaxie IF @sr.ye/32 < @sr.noise * 2 THEN IF note > 0 THEN mPlay Task(%Triple1).channel, note, 0 note = 0 END IF Task(%triple1).freq = 32 EXIT SUB END IF IF Task(%triple1).freq >= 31 THEN Task(%triple1).freq = 4 + @sr.yf/1024 'na een stilte, momentane waarde nemen ELSE 'beetje integreren 'dit wordt direct zeer snel, mr is eigenlijk wel goed zo - zeer responsief.. Task(%triple1).freq = MIN(30, (2 * Task(%triple1).freq + 4 + 30 * SQR(@sr.yf/4096))/3) '4->20 END IF IF (@sr.ya < @sr.noise) AND (note > 0) THEN 'does it ever happen after first noise test? mPlay Task(%Triple1).channel, note, 0 note = 0 END IF mPlay Task(%Triple1).channel, note, 0 note = 36 + 48 * ((@sr.yf) / 2048) ^ 2 velo = MIN(127, 10 + 117 * @sr.ya/2048) mPlay Task(%triple1).channel, note, velo 'mssch nog iets met de panning doen?? END SUB SUB Mim_Triple2 STATIC note AS CURRENCY LOCAL velo AS BYTE IF ISFALSE Task(%Triple2).tog THEN IF ISFALSE Task(%triple).tog THEN StartTask %triple: EXIT SUB END IF 'nieuw 2008 op vraag van MIM naar stukken met directere reaxie IF @sr.ze/32 < @sr.noise * 2 THEN IF note > 0 THEN mPlay Task(%Triple2).channel, note, 0 note = 0 END IF Task(%triple2).freq = 32 EXIT SUB END IF IF Task(%triple2).freq >= 31 THEN Task(%triple2).freq = 4 + @sr.zf/1024 'na een stilte, momentane waarde nemen ELSE 'beetje integreren Task(%triple2).freq = MIN(30, (2 * Task(%triple2).freq + 4 + 30 * SQR(@sr.zf/4096))/3) '4->20 END IF IF (@sr.za < @sr.noise) AND (note > 0) THEN mPlay Task(%Triple2).channel, note, 0 note = 0 END IF mPlay Task(%Triple2).channel, note, 0 note = 36 + 48 * ((@sr.zf) / 2048) ^ 2 velo = MIN(127, 10 + 117 * @sr.za/2048) mPlay Task(%triple2).channel, note, velo 'mssch nog iets met de panning doen?? END SUB SUB Triple_Stop STATIC busy AS DWORD 'recursive loop prot IF busy THEN EXIT SUB busy = 1 StopTask %triple2 StopTask %triple1 StopTask %triple 'deze moet laatst, of hij wordt weer ingeschakeld door de andere busy = 0 END SUB SUB Mim_Drum () ' proc. translated to GMT 06.07.1999 ' new: 07.08.1999: now uses slider(1).value voor sample window accelleration measurement. ' rewritten 21.08.1999 ' 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) 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 = 720 'DAQparams.scanfreq * 60 / 2 Task(%Drum).freq = App.tempo / 60 'DAQparams.scanfreq / 2 ' ' to be checked ' @sr.dT = DAQparams.scanfreq / 8 ' akselpiek needs setting for timeframe! ' Bom.aScale = 64 ' @sr.dT = NrSamp2SampTim(Bom.dSamp, DAQparams.scanfreq) ' 50 @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 ' logfile STR$(@sr.xyza) + STR$(@sr.xa) + STR$(@sr.ya) + STR$(@sr.za) SHIFT RIGHT a0%, 5 ' 7 bits IF noot THEN mplay Task(%Drum).channel + 1, noot, 0: noot = 0 IF a0% < @sr.noise THEN EXIT SUB idr% = AkselPiek ' aperturetime set via slider(1) ' 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% ' logfile FUNCNAME$ + STR$(Task(%Drum).channel + 1) + STR$( noot) + STR$(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% ' logfile FUNCNAME$ + STR$(Task(%Drum).channel + 1) + STR$( noot) + STR$(a0%) oldaccel = idr% END IF END SUB SUB Mim_Edges () EXPORT STATIC c%, Mep% STATIC Flag% STATIC nof() AS BYTE STATIC tof() AS DOUBLE LOCAL timeframe AS WORD ' in ms. LOCAL il%, k% , nr% LOCAL t AS DWORD STATIC nrsamp AS WORD IF ISFALSE Task(%Edges).tog THEN DIM nof(7) DIM tof(7) Task(%Edges).tog = %True Task(%Edges).channel = %False Bom.algo = 18 Bom.mapping = 0 Flag% = 3 timeframe = 800 nrsamp = (DAQparams.scanfreq * timeframe/1000!)/ 4 ' Patches F1-F3 App.tempo = 600 Task(%Edges).freq = App.tempo / 60! @sr.noise = %False MakeTaskUnique %Edges SetDlgItemText gh.Cockpit, %GMT_MSG2, "F1-F3 patches" 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(3,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 t = 255 FOR k% = 4 TO 6 IF (nof(k%)>0) AND ((tof(k%) + 10) < TIMER ) THEN NoteOff Task(%Edges).channel + k%, nof(k%) nof(k%) = n(k%) '0 tof(k%) = TIMER '0 END IF SELECT CASE k% CASE 4 Samp(3,k%) = Databuf4(t) Samp(2,k%) = Databuf4(t-nrsamp) Samp(1,k%) = DataBuf4(t-(2*nrsamp)) Samp(0,k%) = DataBuf4(t-(3*nrsamp)) CASE 5 Samp(3,5) = Databuf5(t) Samp(2,5) = Databuf5(t-nrsamp) Samp(1,5) = DataBuf5(t-(nrsamp*2)) Samp(0,5) = DataBuf5(t-(nrsamp *3)) CASE 6 Samp(3,6) = Databuf6(t) Samp(2,6) = Databuf6(t-nrsamp) Samp(1,6) = DataBuf6(t-(2*nrsamp)) Samp(0,6) = DataBuf6(t-(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%) IF nof(k%) THEN NoteOff Task(%Edges).channel + k%, nof(k%) nof(k%) = n(k%) tof(k%) = TIMER 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%) IF n(k%) <> nof(k%) THEN NoteOff Task(%Edges).channel + k%, nof(k%) nof(k%) = 0 tof(k%) = 0 END IF 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 Mim_Tance () EXPORT LOCAL tc% LOCAL m AS WORD LOCAL jl% LOCAL sig! STATIC no() AS BYTE IF ISFALSE Task(%Tance).tog THEN Task(%Tance).tog = %True Task(%Tance).channel = 0 Bom.algo = 19 Bom.mapping = 0 @sr.noise = %False App.tempo = 330 Task(%Tance).channel = %False Task(%Tance).freq = App.tempo / 60! DIM no(3) MakeTaskUnique %Tance ' set panning: ModeMess Task(%Tance).channel + 0, &HA, 64 ModeMess Task(%Tance).channel + 1, &HA, 0 ModeMess Task(%Tance).channel + 2, &HA, &H7F ModeMess Task(%Tance).channel + 3, &HA, 40 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% = AvgStatArr (Databuf7(), sig!, Daqparams.scanfreq \2) SHIFT RIGHT jl%,8 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 m = AvgStatArr (Databuf3(),sig!,Daqparams.scanfreq \ 2) SHIFT RIGHT m, 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 Mim_Vox_0 () EXPORT STATIC oldnote AS BYTE STATIC oldnote2 AS BYTE IF (Oldnote2 AND OldNote2 <> OldNote) THEN NoteOff Task(%Vox_0).channel, oldnote2 'n(0) oldnote2 = oldnote oldnote = %False ELSEIF OldNote AND n(0) <> OldNote THEN OldNote2 = OldNote OldNote = %false END IF IF n(0) AND n(2) <> OldNote THEN mPlay Task(%Vox_0).channel, n(0), v(0) oldnote = n(0) END IF END SUB SUB Mim_Vox_1 () EXPORT STATIC oldnote AS BYTE STATIC OldNote2 AS BYTE IF Oldnote2 THEN NoteOff Task(%Vox_1).channel, oldnote2 'n(0) oldnote2 = oldnote oldnote = %False ELSEIF OldNote AND n(1) <> OldNote THEN OldNote2 = OldNote OldNote = %false END IF IF n(1) AND n(1) <> OldNote THEN mPlay Task(%Vox_1).channel, n(1), v(1) oldnote = n(1) END IF END SUB SUB Mim_Vox_2 () EXPORT STATIC oldnote AS BYTE STATIC OldNote2 AS BYTE IF Oldnote2 THEN NoteOff Task(%Vox_2).channel, oldnote2 'n(0) oldnote2 = oldnote oldnote = %False ELSEIF OldNote AND OldNote <> n(2) THEN OldNote2 = OldNote OldNote = %false END IF IF n(2) AND n(2) <> OldNote THEN mPlay Task(%Vox_2).channel, n(2), v(2) oldnote = n(2) END IF END SUB SUB Mim_Vox_4 () EXPORT STATIC oldnote AS BYTE STATIC OldNote2 AS BYTE IF Oldnote2 THEN NoteOff Task(%Vox_4).channel, oldnote2 'n(0) oldnote2 = oldnote oldnote = %False ELSEIF OldNote AND OldNote <> n(2) THEN OldNote2 = OldNote OldNote = %false END IF IF n(4) AND n(4) <> OldNote THEN mPlay Task(%Vox_2).channel, n(4), v(4) oldnote = n(4) END IF END SUB SUB Mim_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 = "" ' Bom.tog ButnSW(2).cptr = %False ButnSW(3).tag0 = "" ' Bom.sustain was ^ in bom96 ButnSW(3).cptr = %False ButnSW(4).tag0 = "" ' creates/kills a harmony display window - = default button ButnSW(4).cptr = %False ButnSW(5).tag0 = "" ButnSW(5).cptr = %False ButnSW(6).tag0 = "" ButnSW(6).cptr = %False ButnSW(7).tag0 = "SPECT" ' creates/kills a spectrum display window ButnSW(7).tag1 = "Spec Off" ButnSW(8).tag0 = "Monitor" ButnSW(8).tag1 = "Monit Off" ButnSW(8).cptr = %False ButnSW(10).tag0 = "" ButnSW(11).tag0 = "" ButnSW(11).cptr = %False ' ONE SHOT FUNCTIONS: ButnOS(1).tag = "" ' sound gong in recplay... ButnOS(1).cptr = %False ButnOS(2).tag = "" ' changes tuning in Bom on Proteus 3. ButnOS(2).cptr = %False ButnOS(3).tag = "" ButnOS(3).cptr = %False ButnOS(4).tag = "" ButnOS(4).cptr = %False ButnOS(5).tag = "" ButnOS(5).cptr = %False ButnOS(6).tag = "" ButnOS(6).cptr = %False ButnOS(7).tag = "" 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 = "" ' reset not very well implemented yet... problem with all local static var's in the procs. ButnOS(9).cptr = %False ButnOS(10).tag = "" ButnOS(10).cptr = %False App.butnSWCptr = CODEPTR(Bom_ButnSWHandler) App.butnOSCptr = CODEPTR(Bom_ButnOShandler) App.MonitorCptr = GetProcAddress(GetModuleHandle("g_lib.dll"),UCASE$("MonitorHandler")) END SUB SUB Mim_autostart LOCAL i AS LONG LOCAL x AS DWORD, y AS DWORD LOCAL dx AS DWORD ' static hw as dword LOCAL bigfont AS DWORD LOCAL medfont AS DWORD ' MSGBOX FUNCNAME$ Readsetup "c:\b\pb\gmt\config\mim.cfg" 'App.Id = %ID_II_MIM FOR i = 1 TO 100 'make sure readsetup's fake clicks get processed DIALOG DOEVENTS NEXT ' Mim_readinifile ' Init_Mim FOR i = 1 TO 100 'make sure readsetup's fake clicks get processed DIALOG DOEVENTS NEXT FOR i = 1 TO 100 'make sure readsetup's fake clicks get processed DIALOG DOEVENTS NEXT SendMessage gh.setup, %WM_COMMAND, %ID_II_MIM , 0 SendMessage gh.setup, %WM_COMMAND, %IDM_GMTMAINSTART , 0 ' Showwindow gh.cockpit, %SW_HIDE ' StartApplication ' CloseWindow gh.setup DIALOG NEW 0, "Invisible Instrument",,,200,80, %DS_3DLOOK OR %DS_CENTER OR %DS_MODALFRAME OR %WS_CAPTION OR %DS_SYSMODAL OR %WS_MAXIMIZE, %WS_EX_APPWINDOW OR %WS_EX_TOPMOST TO hw DIALOG SET COLOR hw, %BLACK, %WHITE DIALOG GET CLIENT hw TO x, y FONT NEW "Arial", 18,1,0,0,0 TO bigfont FONT NEW "Arial", 12,1,0,0,0 TO medfont dx = x/8-80 CONTROL ADD CHECKBOX, hw, 1, "De&mo mode", dx, 10, 160, 40, %BS_PUSHLIKE CONTROL SET COLOR hw, 1, %BLACK, %WHITE CONTROL SET FONT hw, 1, bigfont CONTROL ADD CHECKBOX, hw, 2, "T&opoi",dx, 54, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 3, "M&inor",dx, 74, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 4, "B&eat",dx, 94, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 5, "S&forte",dx, 114, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 6, "Le&ad",dx, 134, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 7, "Ca&nvas",dx, 154, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 8, "Si&mple",dx, 174, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 9, "T&riple",dx, 194, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 10, "So&lo",dx, 214, 160, 16, %BS_PUSHLIKE CONTROL ADD CHECKBOX, hw, 11, "D&rum",dx, 234, 160, 16, %BS_PUSHLIKE FOR i = 2 TO 11 CONTROL SET FONT hw, i, medfont NEXT dx = 3*x/8 - 80 CONTROL ADD CHECKBOX ,hw, 101, "Namu&da",dx, 10, 160,40, %BS_PUSHLIKE 'cb should swithc sonar mode on/off CONTROL SET FONT hw, 101, bigfont dx = x/8 - 80 CONTROL ADD BUTTON, hw, 5000, "exit", dx, 363, x/4 + 160, 40 CONTROL SET FONT hw, 5000, bigfont CONTROL ADD LABEL, hw,1000, "", 10, y - 50, x - 20, 40, %SS_SUNKEN CONTROL SET FONT hw, 1000, medfont CONTROL SET COLOR hw, 1000, %RED, %WHITE CONTROL ADD LABEL, hw, 2010, "Tetrahedron display", 3 * x/4 - 100, 10, 200, 16, %SS_LEFT CONTROL SET COLOR hw, 2010, %BLACK, %WHITE CONTROL SET FONT hw, 2010, medfont CONTROL ADD GRAPHIC ,hw, 2000, "", 3 * x/4 - 100, 26, 200, 200, %WS_BORDER CONTROL HANDLE hw, 2000 TO gh.spec CONTROL ADD LABEL, hw, 2011, "VU display", 3 * x/4 - 100, 240, 200, 16, %SS_LEFT CONTROL SET COLOR hw, 2011, %BLACK, %WHITE CONTROL SET FONT hw, 2011, medfont CONTROL ADD GRAPHIC, hw, 2001, "", 3 * x/4 - 100, 254, 131, 159, %WS_BORDER CONTROL HANDLE hw, 2001 TO Task(%Sonar_VU_Task).hParam DIALOG SHOW MODELESS hw CALL cb_mim CONTROL SEND hw, 1, %BM_CLICK, 0, 0 FOR i = 1 TO 1000 DIALOG DOEVENTS NEXT StartTask %Sonar_VU_Task StartTask %Sonar_Display_Task END SUB CALLBACK FUNCTION cb_mim LOCAL i AS LONG, j AS LONG, k AS LONG SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTLMSG CASE %BN_CLICKED SELECT CASE CBCTL CONTROL GET CHECK CBHNDL, CBCTL TO i CASE 1 IF i THEN CONTROL GET CHECK CBHNDL, 101 TO j IF j THEN CONTROL SEND CBHNDL, 101, %BM_CLICK, 0, 0 CONTROL SET TEXT CBHNDL, 1000, "Demo mode - cycling through different demo's" StartTask %Mim_demotask ELSE ' msgbox "stop demotask",,funcname$ CONTROL SET TEXT hw, 1000, "stop demo from cb" StopTask %Mim_DemoTask Mim_demo 1 FOR i = 2 TO 11 CONTROL GET CHECK CBHNDL, i TO j IF j THEN CONTROL SEND CBHNDL, i, %BM_CLICK, 0, 0 NEXT CONTROL SET TEXT CBHNDL, 1000, "" END IF CASE 2 TO 11 IF ISFALSE i THEN 'unchecked Mim_stop CBCTL ELSE FOR j = 2 TO 11 IF j = CBCTL THEN ITERATE FOR CONTROL GET CHECK CBHNDL, j TO k IF k THEN CONTROL SEND CBHNDL, j, %BM_CLICK, 0, 0 NEXT Mim_Start CBCTL END IF CASE 101 'make sure normal demo tasks are off CONTROL GET CHECK CBHNDL, CBCTL TO j IF j THEN CONTROL GET CHECK CBHNDL, 1 TO j IF j THEN CONTROL SEND CBHNDL, 1, %BM_CLICK, 0, 0 ELSE FOR i = 2 TO 11 CONTROL GET CHECK CBHNDL, i TO j IF j THEN CONTROL SEND CBHNDL, i, %BM_CLICK, 0, 0 NEXT END IF CONTROL SET TEXT CBHNDL, 1000, "Namuda mode - select more advanced algorithms" ELSE ' CONTROL SET TEXT CBHNDL, 1000, "Namuda mode off" 'put all namuda related tasks off and set daq bqck to normal mode END IF CASE 5000 DIALOG END CBHNDL ' msgbox str$(gh.cockpit) wndproc gh.cockpit, %WM_DESTROY, 0, 0 'dialog end or dialog send don't seem to do the trick ' dialog end gh.setup ' end END SELECT END SELECT END SELECT END FUNCTION SUB Mim_stop (i AS LONG) SELECT CASE i CASE 2: StopTask %topoi CASE 3: StopTask %minor CASE 4: StopTask %beat CASE 5: StopTask %sforte CASE 6: StopTask %lead CASE 7: StopTask %canvas CASE 8: StopTask %simple CASE 9: StopTask %triple CASE 10: StopTask %solo CASE 11: StopTask %drum END SELECT END SUB SUB Mim_start (i AS LONG) SELECT CASE i CASE 2: startTask %topoi CASE 3: startTask %minor CASE 4: startTask %beat CASE 5: StartTask %sforte CASE 6: startTask %lead CASE 7: startTask %canvas CASE 8: startTask %simple CASE 9: startTask %triple CASE 10: startTask %solo CASE 11: startTask %drum END SELECT END SUB SUB Mim_demo(OPT BYVAL stopit AS DWORD) 'to do STATIC currenttask AS LONG STATIC lasttask AS LONG STATIC lastchange AS DWORD STATIC nomov AS LONG LOCAL t AS DWORD IF stopit THEN currenttask = 0 EXIT SUB END IF CONTROL HANDLE hw, 2000 TO Task(%DopplerTetraDisplay).hParam IF ISFALSE currenttask THEN nomov = 5 currenttask = 2 + RND * 8 CONTROL SEND hw, currenttask, %BM_CLICK, 0, 0 ' control set text hw, 1000, "starting" + str$(currenttask) lastchange = timegettime EXIT SUB END IF CONTROL SET TEXT hw, 1000, STR$(INT(timegettime/1000)) IF (timegettime - lastchange) < 30000 THEN EXIT SUB 'if it's more then 30" since we last change algorythm, and there's no movement, switch algorythm t = UBOUND(DataBuf0) DIM AD3 AS LOCAL INTEGER AD3 = DataBuf3(t) SHIFT RIGHT AD3, 4 ' makes it 8 bits CONTROL SET TEXT hw, 1000, STR$(INT(timegettime/1000)) + STR$(AD3) + STR$(nomov) IF AD3 > nomov THEN EXIT SUB DO currenttask = 2 + RND * 10 LOOP WHILE currenttask = lasttask lasttask = currenttask logfile "select" + STR$(currenttask) startSonarDaq SLEEP 100 CONTROL SEND hw, currenttask, %BM_CLICK, 0, 0 lastchange = timegettime END SUB SUB Mim_drawtet LOCAL a() AS SINGLE LOCAL i AS LONG STATIC hwt AS DWORD IF ISFALSE hwt THEN CONTROL HANDLE hw, 2000 TO hwt END IF DIM a(5) a(0) = @sr.xa/4096 ' normalized - may need further integration! a(1) = @sr.ya/4096 ' drawn in blue a(2) = @sr.za/4096 ' logfile STR$(a(0)) + STR$(a(1)) + STR$(a(2)) ' a(3) = MIN(@sr.xf / 128,1) ' to be checked for realistic range ' a(4) = MIN(@sr.yf / 128,1) ' this should be a normalisation ' a(5) = MIN(@sr.zf / 128,1) DrawRadarTriangle hwt, a() ' in: g_glib.dll END SUB '[EOF]