' removed from Techofaustus: Eary.inc: SUB Cqt2_Ctrl () STATIC slnr AS BYTE STATIC udnr AS BYTE STATIC cc33 AS BYTE STATIC cc34 AS BYTE STATIC cc40 AS BYTE STATIC cc41 AS BYTE STATIC cc42 AS BYTE ' dsp pitch 2 midi converter ' The port setting are now read from the inifile (called in faust.inc) 'Midi in reageert op deze controllers op channel 1 'Midi out is ook midi thru - da's heel stom... 'Goede waarden voor GWR's stem: ' CC33=75 ' CC34=85 (decimaal) ' * MIDI Controller mapping : ' * CC33 = note onset sensitivity ---> slider 0 ' * more = more false note on messages ' * default = 64 ' * CC34 = note offset sensitivity ---> slider 1 ' * zero = no hysteresis loop, more aborted and repeated notes ' * max = large hysteresis loop, better for chords/polyfonic music ' * CC35 = meta_q_c1 sensitivity ' * CC36 = meta_q_c2 sensitivity ' * CC37 = meta_s_c5 harmonic rejection ' * CC38 = meta_s_c7 harmonic rejection ' * CC39 = meta_s_c9 harmonic rejection ' * CC40 = transpoze in semitones ---> UD ctrl ' * default = 0 = no transposition ' * BUG : Changing transposition while notes are 'on', will leave them 'on'. ' * CC41 = Highest note limit ---> slider 2 ' * default = 127 ' * CC42 = Lowest note limit ---> slider 3 ' * default = 0 ' * Actual limits inherent to the CQT: ' * Low actual limit is 51.91Hz == G#1 == MIDI 0x20 '= 32 ' * High actual limit is 1760 Hz == A6 == MIDI 0x5D '= 93 ' * So the actual range is 5 octaves (!) 'default '.init midicc33: 64; -> slider 0 '.init midicc34: 64; -> slider 1 '.init midicc35: 64; ud 1 ' sets midi-channel ??? '.init midicc36: 64; ud 2 '.init midicc37: 64; ud 3 '.init midicc38: 64; '.init midicc39: 64; '.init midicc40: 64; -> updown 0 '.init midicc41: 127; -> slider 2 '.init midicc42: 0; -> slider 3 IF ISFALSE Task(%cqt).tog THEN Task(%cqt).tog = %True ' create a parameter window automatically: ' The handle for this window will be returned in Task(%cqt).hParam DIM TaskParamLabels(7) AS LOCAL ASCIIZ * 8 ' first set the sliderlabels: TaskParamLabels(0) = "Onset" 'cc33 TaskParamLabels(1) = "Offset" 'cc34 TaskParamLabels(2) = "HiLim" 'cc41 TaskParamLabels(3) = "Lolim" 'cc42 ' continue with the updown labels: TaskParamLabels(4) = "Transpo" 'cc40 TaskParamLabels(5) = "c35=" TaskParamLabels(6) = "c36=" TaskParamLabels(7) = "c37=" IF ISFALSE Task(%cqt).hParam THEN MakeTaskParameterDialog %cqt,4,Slider(),4,UDctrl(),TaskParamLabels() MoveWindow Task(%cqt).hparam,0,0,250,200,%True END IF cc33 = 75 ' slider 0 cc34 = 85 ' slider 1 cc40 = 64 ' Up Down 0 cc41 = 93 '127 ' slider 2 cc42 = 32 '0 ' slider 3 modemess cqt.outchannel,33,75 '64 modemess cqt.outchannel,34,85 '64 modemess cqt.outchannel,35,64 modemess cqt.outchannel,36,64 modemess cqt.outchannel,37,64 modemess cqt.outchannel,38,64 modemess cqt.outchannel,39,64 modemess cqt.outchannel,40,64 ' U/D 0 modemess cqt.outchannel,41,cqt.hightes '93 '127 modemess cqt.outchannel,42,cqt.lowtes '32 '0 END IF IF slnr = %False THEN slnr = TaskEX(%cqt).SliderNumbers(0) Slider(slnr).value = cc33 Slider(slnr+1).value = cc34 Slider(slnr+2).value = cc41 Slider(slnr+3).value = cc42 SendMessage Slider(slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value SendMessage Slider(slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value SendMessage Slider(slnr+2).h, %TBM_SETPOS,%True, Slider(Slnr+2).value SendMessage Slider(slnr+3).h, %TBM_SETPOS,%True, Slider(Slnr+3).value EXIT SUB END IF IF udnr = %False THEN udnr = TaskEX(%cqt).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(UD_CC40) UDctrl(udnr).value = cc40 UDctrl(udnr+1).cptr = CODEPTR(UD_1) ' not used yet. -cc35 UDctrl(udnr+1).value = 64 'channel UDctrl(udnr+2).value = 64 'ctrl nr. offset -cc36 UDctrl(udnr+2).cptr = CODEPTR(UD_2) UDctrl(udnr+3).value = 64 UDctrl(udnr+3).cptr = CODEPTR(UD_3) '-cc37 EXIT SUB END IF IF Slider(slnr).value <> cc33 THEN cc33 = Slider(slnr).value modemess cqt.outchannel,33,cc33 END IF IF Slider(slnr+1).value <> cc34 THEN cc34 = Slider(slnr+1).value modemess cqt.outchannel,34,cc34 END IF ' potential bug: cc41 must be > cc42, this is not checked here. IF Slider(slnr+2).value <> cc41 THEN cc41 = Slider(slnr+2).value modemess cqt.outchannel,41,MIN(93,cc41) END IF IF Slider(slnr+3).value <> cc42 THEN cc42 = Slider(slnr+3).value modemess cqt.outchannel,42,MAX(32,cc42) END IF END SUB SUB UD_CC40 () ' for callback on parameter UpDowns. LOCAL cc40 AS BYTE cc40 = UDCtrl(TaskEX(%cqt).UpdownNumbers(0)).value SetDlgItemText Task(%cqt).hparam, %GMT_TEXT0_ID + 16, "T=" & STR$(cc40) ModeMess cqt.outchannel,40,cc40 END SUB SUB UD_1 () ' test ud used for setting the channel through which we send messages to the cqf2 LOCAL value AS BYTE LOCAL ck AS BYTE value = UDCtrl(TaskEX(%cqt).UpdownNumbers(1)).value ck = value MOD 16 IF value > 127 THEN value = 127 Modemess cqt.outchannel,35,value SetDlgItemText Task(%cqt).hparam, %GMT_TEXT0_ID + 17, "c35=" & STR$(value) ' should become: cqt.outchannel = cqt.outchannel AND &HFF00 cqt.outchannel = cqt.outchannel OR ck END SUB SUB UD_2 () LOCAL value AS BYTE value = UDCtrl(TaskEX(%cqt).UpdownNumbers(2)).value IF value > 127 THEN value = 127 Modemess cqt.outchannel,36,value SetDlgItemText Task(%cqt).hparam, %GMT_TEXT0_ID + 18, "c36=" & STR$(value) END SUB SUB UD_3 () LOCAL value AS BYTE value = UDCtrl(TaskEX(%cqt).UpdownNumbers(3)).value 'cc = (value - 64) MOD 16 IF value > 127 THEN value = 127 Modemess cqt.outchannel,37,value SetDlgItemText Task(%cqt).hparam, %GMT_TEXT0_ID + 19, "c37=" & STR$(value) END SUB SUB Cqt_Listen_old () ' moved to g_lib.dll - module g_main.inc - 28.08.2005 ' listens to channels and port set in inifile LOCAL nv%, noot?, velo? STATIC Cnt() AS BYTE STATIC oldwijzer AS DWORD STATIC silenceflag AS BYTE LOCAL wijzer AS DWORD LOCAL nrevents AS LONG IF ISFALSE Task(%Listen_Task).tog THEN cqt.vol = 4 ' midi level cqt.tes = 25 ' in Hz cqt.dens = 0.1 ' in events/sec (Hz) Task(%Listen_Task).tog = %True Task(%Listen_Task).Har.vel = STRING$(128,0) ' blank buffer Task(%Listen_Task).channel = cqt.inchannel SetMidiListenChannel cqt.inchannel, %True ' new 20.12.2002 REDIM Cnt(255) ' 1 byte for every cs. - so we integrate over 2,56 seconds END IF ' This task does not do any music generation in itself. It links the real time input from a performer ' via the cqt midi-in device and writes this midi input into the harmony string. ' read and remove the notes from the midi-input buffer: nv% = GetMidiNote% (cqt.inchannel, %Remove OR %Oldest) IF nv% = %NotFalse THEN EXIT SUB ' if no note came in, exit the task ELSE velo? = LOBYT (nv%) noot? = HIBYT (nv%) ' write it to the harmony-string (polyphonic) IF velo? THEN AddNote2Har Task(%Listen_task).Har, noot?,velo? ELSE DelNote2Har Task(%Listen_task).Har, noot? END IF END IF ' for testing: 'PlayHar Task(%Listen_task).Har , Task(%Listen_Task).channel ' bereken de gemiddelde geluidsterkte van de input IF velo? THEN cqt.Vol = cqt.Vol + cqt.Vol + cqt.Vol + velo? SHIFT RIGHT cqt.Vol, 2 END IF ' ' bereken de gemiddelde tessituurligging van de input IF noot? THEN cqt.tes = ((cqt.tes * 3) + N2F(noot?)) / 4 END IF ' calculate the density of the input over a timeframe of 255cs. ' The result is returned in cqt.dens wijzer = (timeGetTime / 10) 'MOD 256 wijzer = wijzer AND 255 IF wijzer <> oldwijzer THEN DO INCR oldwijzer oldwijzer = oldwijzer AND 255 Cnt(oldwijzer) = %False LOOP UNTIL oldwijzer = wijzer END IF Cnt(wijzer) = %True ' now count the number of events in the buffer: FOR wijzer = 0 TO 255 IF Cnt(wijzer) THEN INCR nrevents NEXT wijzer cqt.dens = (nrevents/2) / 2.56! ' express result in (events/2)/second FillHarType Task(%Listen_task).har END SUB SUB Cqt_Eary_Silencemonitor_old () ' integrated with cqt listentask in dll since 28.08.2005. ' this task increments the silence field in the cqt type, when silence is happening. ' the procedure is used in as well! Task(%Eary_SilenceMonitor).freq = 10 IF Task(%Listen_task).har.vel = STRING$(128,0) THEN cqt.silencetimer = cqt.silencetimer + 100 ' in ms, or + 10 for cs IF cqt.notetimer THEN cqt.dur = cqt.notetimer ' remember last sound duration END IF cqt.notetimer = %False ELSE cqt.notetimer = cqt.notetimer + 100 IF cqt.silencetimer THEN cqt.rest = cqt.silencetimer ' remember last rest... END IF cqt.silencetimer = %False END IF END SUB