' ************************************************** ' * AEIO * ' * hard and firmware testcode and research tools * ' * by * ' * Prof.dr.Godfried-Willem Raes * ' * 2009-2010-2017 * ' ************************************************** ' 09.08.2009: first redaction of the aeio play procedure ' this procedure should be translated into the ' master controller of the aeio robot. ' For now, it requires 12 midi channels and should thus ' be connected to a aeio-exclusive midi port. ' implemented controllers sofar: ' cc3 : pwm ta phase (0-25%) ' cc4 : pwm tb phase (0-25%) ' cc20: basic tuning, note offset (24-60) normally 36-47 ' cc22: flageolet multiplier (1-32) ' cc24: fine tuning in cents (0-127) ' cc69: ebow mechanism on/off (switch) ' to be added: ' cc64: damper mechanism on note off's on/off ' cc65: enable note off with release to control the damping force ' cc7 : volume controller ' velo: hammer velocity ' vibrato: slight frequency shift (phasing) ' lights ' damper velocity on note release ' 26.07.2010: first preliminary coding to enable further development. ' 27.07.2010: this code should -as for now- only be used by GWR... ' lack of understanding of how's and why's can easily cause smoke stacks. ' notes 36,37,38,39, 42, 45 works, though too soft and with a bug in the multiplier code in the firmware ' notes 40,43,46,47 probably all burned out... (they worked at the most a few seconds...) ' note 41: 1 of the coils burned out ' 28.07.2010: added fine tuning code for research on inharmonicity. ' 04.07.2010: transposition bug in pic firmware: CC20 must be set to 40 in order to sound note 36 ' 11.08.2010: Aeio to be used for bourdons in albion concert production. ' 31.08.2010: Start port of coding to the Microchip 18F25K20 on an Amicus board. ' 02.09.2010: test proces added for new pic in column 2, tasks 16-31 ' PIC code developed for the 18F25K20 using the Proton+ compiler. ' 07.09.2010: more testcode added for the new parserfirmware. ' 19.09.2010: Light implementation changed. ' 24.10.2017: Parser board upgraded, using a 16 bit PIC. Lights now handled by a 18F on the parser board. ' This is version 2.0. Pic sourcecode in the \picworks directory for Aeio ' 31.10.2017: Needs update to make it possible to test the radar board now. TYPE StringType DWORD ' materiaalkonstanten: sg AS SINGLE ' soortelijke massa van het snaarmateriaal kg/l dens AS SINGLE ' densiteit in kg/m lengte diam AS SINGLE ' diameter in mm opp AS SINGLE ' oppervlakte van de doorsnede (mm^2) breuk AS SINGLE ' breukgrens in Newton , tensile strength trekgrens AS SINGLE ' maximale trekkracht per mm2 bij breuk (N/mm2) (trekvastheid) comp AS STRING * 8 ' materiaal waaruit de snaar is samengesteld. em AS DOUBLE ' Youngs modulus (elasticiteits modulus) c AS DOUBLE ' wave propagation speed through the string ' parameters force AS SINGLE ' spankracht in Newton op de snaar (N) trek AS SINGLE ' trekkracht per oppervlakte eenheid (N/mm2) noot(1 TO 32) AS SINGLE ' fractional midi noot freq(1 TO 32) AS SINGLE ' frekwentie (Hz) length AS SINGLE ' trillende lengte van de snaar (m) ' inharmoniciteit in 2-->32 END TYPE #IF %DEF(%Aeio_Parser) 'procedures for 12-channel debugging %Aeio_Tune = 32 'for tuning the strings %Aeio_Scale = 33 %Aeio_Phase = 36 'cc3 and cc4 %Aeio_Hammers = 37 %Aeio_FineTune = 38 'cc24 - for inharmonicity research 'separate procs. for each string: %Aeio_S36 = 48 %Aeio_S37 = 49 %Aeio_S38 = 50 %Aeio_S39 = 51 %Aeio_S40 = 52 %Aeio_S41 = 53 %Aeio_S42 = 54 %Aeio_S43 = 55 %Aeio_S44 = 56 %Aeio_S45 = 57 %Aeio_S46 = 58 %Aeio_S47 = 59 #ENDIF '---------------- 'MasterPic evaluation test code - works on the normal aeio.channel (=1) %MC_Scale = 18 %MC_Hammers = 19 %MC_Note = 20 %MC_CC7_CC23 = 21 '%MC_PWM = 22 %MC_Funda = 23 'CC50-51, basic tuning for each string. Normally 40-51 %MC_Flag = 24 'send flageolets %MC_Progchange = 25 'change lookuptables for tuning %Torture = 26 %Lite1 = 32 %Lite2 = 33 'red %Lite3 = 34 %Lite4 = 35 %Lite5 = 36 %Lite6 = 37 %uforaeio = 10 'piece by xof ' constants for the radar testcode: %Aeio_Radar = 1 #IF %DEF(%Aeio_Parser) DECLARE FUNCTION Init_Aeio () AS LONG DECLARE FUNCTION Aeio_Play (BYVAL note AS BYTE, BYVAL velo AS BYTE) AS SINGLE DECLARE SUB Aeio_Tuner () DECLARE FUNCTION Aeio_Tuner_UD () AS LONG DECLARE SUB Aeio_Scale () DECLARE SUB Aeio_phase () DECLARE SUB Aeio_Hammers () 'tests hammers and dampers DECLARE SUB Aeio_Hammers_UD () DECLARE SUB Aeio_FineTune () DECLARE SUB Aeio_FineTune_UD () DECLARE SUB Aeio_FineTune_Stop () 'procedures for test and evaluation of the dsPIC boards. DECLARE SUB Aeio_S36 () DECLARE SUB Aeio_S37 () DECLARE SUB Aeio_S38 () DECLARE SUB Aeio_S39 () DECLARE SUB Aeio_S40 () DECLARE SUB Aeio_S41 () DECLARE SUB Aeio_S42 () DECLARE SUB Aeio_S43 () DECLARE SUB Aeio_S44 () DECLARE SUB Aeio_S45 () DECLARE SUB Aeio_S46 () DECLARE SUB Aeio_S47 () DECLARE SUB Aeio_S36_UD () DECLARE SUB Aeio_S36_Okt_UD () DECLARE SUB Aeio_S37_UD () DECLARE SUB Aeio_S38_UD () DECLARE SUB Aeio_S39_UD () DECLARE SUB Aeio_S40_UD () DECLARE SUB Aeio_S41_UD () DECLARE SUB Aeio_S42_UD () DECLARE SUB Aeio_S43_UD () DECLARE SUB Aeio_S44_UD () DECLARE SUB Aeio_S45_UD () DECLARE SUB Aeio_S46_UD () DECLARE SUB Aeio_S47_UD () DECLARE SUB Aeio_S36_Stop () DECLARE SUB Aeio_S37_Stop () DECLARE SUB Aeio_S38_Stop () DECLARE SUB Aeio_S39_Stop () DECLARE SUB Aeio_S40_Stop () DECLARE SUB Aeio_S41_Stop () DECLARE SUB Aeio_S42_Stop () DECLARE SUB Aeio_S43_Stop () DECLARE SUB Aeio_S44_Stop () DECLARE SUB Aeio_S45_Stop () DECLARE SUB Aeio_S46_Stop () DECLARE SUB Aeio_S47_Stop () #ENDIF ' design procedures and functions: DECLARE FUNCTION String_Force (BYVAL noot AS SINGLE, BYVAL d AS SINGLE, BYVAL length AS SINGLE, BYVAL sg AS SINGLE) AS SINGLE DECLARE FUNCTION String_Freq (BYVAL length AS SINGLE, BYVAL force AS SINGLE, BYVAL dens AS SINGLE) AS SINGLE DECLARE FUNCTION String_Gage (BYVAL noot AS SINGLE, BYVAL length AS SINGLE, BYVAL sg AS SINGLE, BYVAL force AS SINGLE) AS SINGLE DECLARE FUNCTION GetMass (s AS STRING * 8) AS SINGLE DECLARE FUNCTION String_Get_B_Param (snaar AS StringType) AS SINGLE 'test code for the master PIC controller [18F25K20] 'changed to 24EP128MC202 processor, 10.2017 DECLARE SUB MC_Scale () DECLARE SUB MC_Hammers () DECLARE SUB MC_Note () DECLARE SUB MC_CC7_CC23 () 'DECLARE SUB MC_PWM () DECLARE SUB MC_Funda () DECLARE SUB MC_Flag () DECLARE FUNCTION MC_Aeio_Note_UD () AS LONG DECLARE FUNCTION MC_Aeio_Flag_UD () AS LONG DECLARE SUB MC_Progchange () DECLARE FUNCTION MC_Progchange_UD () AS LONG DECLARE SUB Torture () DECLARE SUB Lite1 () ' steered by 18F pic on parser board 2017 DECLARE SUB Lite2 () DECLARE SUB Lite3 () DECLARE SUB Lite4 () DECLARE SUB Lite5 () DECLARE SUB Lite6 () GLOBAL hwCtrlAeio AS DWORD 'test code for the radar board: DECLARE SUB Radar () ' %Aeio_Radar FUNCTION Init_Aeio () AS LONG ' MSGBOX "Aeio support in development" 'local snaar as stringtype DIM aeio_str(36 TO 47) AS GLOBAL Stringtype LOCAL i AS DWORD LOCAL r AS SINGLE LOCAL f AS SINGLE LOCAL noot AS SINGLE LOCAL lengte AS SINGLE LOCAL exitationpoint AS SINGLE LOCAL bp AS SINGLE #IF %DEF(%Aeio_Parser) GLOBAL debugport AS WORD #ENDIF ' La = 440.00 ' GrondDo = La * (2!^(3!/12!))/64! ' staalsnaar: aeio_str(36).comp = "Fe" aeio_str(36).sg = GetMass(aeio_str(36).comp) aeio_str(36).length = 1.00 ' in meter voor midi noot 36 aeio_str(36).trekgrens = 550 ' N/mm2 aeio_str(36).diam = 1.5 ' 1.2 is also in stock aeio_str(36).opp = Pi * (aeio_str(36).diam /2) ^ 2 ' in mm2 ' 1.5mm staal snaar, gestemd op C (65Hz)= midi 36 aeio_str(36).noot(1) = 36 aeio_str(36).freq(1) = N2F(aeio_str(36).noot(1)) r = (aeio_str(36).diam / 2.00) / 1000 ' convert to meter ' volume van 1m snaar: Pi * r^2 in m3 ' gewicht van 1 m3 = aeio_str(36).sg * 1000 aeio_str(36).dens = aeio_str(36).sg * Pi * (r ^2) * 1E3 ' kg/ m aeio_str(36).force = String_Force (aeio_str(36).noot(1),aeio_str(36).diam,aeio_str(36).length,aeio_str(36).sg) aeio_str(36).trek = aeio_str(36).force / (Pi * ((aeio_str(36).diam /2) ^2)) aeio_str(36).breuk = aeio_str(36).trekgrens * aeio_str(36).opp ' 1.5mm staal snaar, gestemd op C (65Hz)= midi 36 aeio_str(36).noot(1) = 36 aeio_str(36).freq(1) = N2F(aeio_str(36).noot(1)) ' inharmoniciteit parameters aeio_str(36).em = 2E11 ' Youngs modulus Pa aeio_str(36).c = SQR(aeio_str(36).force/aeio_str(36).dens) bp = String_Get_B_Param (aeio_str(36)) ' calculate partial lookup table for each string ' freq(1) = snaar.freq ' grondtoon FOR i = 2 TO 32 aeio_str(36).freq(i) = aeio_str(36).freq(1) * i * SQR(1+(bp*(i^2))) aeio_str(36).noot(i) = F2NF(aeio_str(36).freq(i)) NEXT i ' FOR noot = 37 TO 47 ' lengte = 1000 * (snaar.length * (1/ (2^((noot-36)/12)))) ' exitationpoint = lengte / 7 ' ' PRINT "Noot " & STR$(noot) & " lengte = " & STR$(lengte) & " exitation point=" & STR$(exitationpoint) ' ' PRINT #b, "Noot " & STR$(noot) & " lengte = " & STR$(lengte) & " exitation point=" & STR$(exitationpoint) & " tangent=" & STR$(lengte/9) ' NEXT noot ' make lookup file for all partials: ' inharmoniciteit parameters ' em = 2E11 ' Youngs modulus Pa ' c = SQR(snaar.force/snaar.dens) FOR noot = 37 TO 47 aeio_str(noot).em = aeio_str(36).em aeio_str(noot).c = aeio_str(36).c aeio_str(noot).length = (aeio_str(36).length * (1/ (2^((noot-36)/12)))) ' in m aeio_str(noot).noot(1) = noot aeio_str(noot).freq(1) = N2F(noot) aeio_str(noot).force = aeio_str(36).force aeio_str(noot).sg = aeio_str(36).sg aeio_str(noot).diam = aeio_str(36).diam aeio_str(noot).dens = aeio_str(36).dens aeio_str(noot).opp = aeio_str(36).opp aeio_str(noot).comp = aeio_str(36).comp aeio_str(noot).breuk = aeio_str(36).breuk aeio_str(noot).trek = aeio_str(36).trek bp = String_Get_B_Param (aeio_str(noot)) ' calculate partial lookup table for each string ' freq(1) = snaar.freq ' grondtoon FOR i = 2 TO 32 aeio_str(noot).freq(i) = aeio_str(noot).freq(1) * i * SQR(1+(bp*(i^2))) aeio_str(noot).noot(i) = F2NF(aeio_str(noot).freq(i)) NEXT i NEXT noot #IF %DEF(%Aeio_Parser) ' we use channels 0-11 on port 5 for these tests, this way there will be no interference ' with our test code for the mastercontroller. debugport = &H0500 'aeio.channel AND &HFF00 FOR i = 0 TO 11 Controller debugport + i, 69, 64 ' on/off switch Controller debugport + i, 20, 65 + i ' to get 36 + i ' set the tuning right Controller debugport + i, 22, 1 ' set multiplier to 1 (flageolet) Controller debugport + i, 24, 64 ' reset the fine tuning controller Controller debugport + i, 3, 64 ' set pwm-A to 12.5% Controller debugport + i, 4, 64 ' set pwm-B to 12.5% NEXT i Task(%Aeio_Tune).naam = "Tuner" Task(%Aeio_Tune).cptr = CODEPTR(Aeio_Tuner) Task(%Aeio_Tune).freq = 20 TaskEX(%Aeio_Tune).stopCptr = CODEPTR(MM_Aeio_Off) Task(%Aeio_scale).Naam = "Scale" Task(%Aeio_scale).cptr = CODEPTR(Aeio_Scale) Task(%Aeio_scale).freq = 8 TaskEX(%Aeio_scale).stopCptr = CODEPTR(MM_Aeio_Off) Task(%Aeio_phase).naam = "Phase" Task(%Aeio_Phase).cptr = CODEPTR(Aeio_Phase) Task(%Aeio_Phase).freq = 20 Task(%Aeio_Phase).flags = %False Task(%Aeio_hammers).naam = "Hammers" '27.07.2010 Task(%Aeio_hammers).cptr = CODEPTR(Aeio_Hammers) Task(%Aeio_hammers).freq = 1 Task(%Aeio_hammers).flags = %False Task(%Aeio_S36).naam = "S36" Task(%Aeio_S36).cptr = CODEPTR(Aeio_S36) Task(%Aeio_S36).freq = 4 Task(%Aeio_S36).flags = %False TaskEX(%Aeio_S36).stopCptr = CODEPTR(Aeio_S36_Stop) Task(%Aeio_S37).naam = "S37" Task(%Aeio_S37).cptr = CODEPTR(Aeio_S37) Task(%Aeio_S37).freq = 4 Task(%Aeio_S37).flags = %False TaskEX(%Aeio_S37).stopCptr = CODEPTR(Aeio_S37_Stop) Task(%Aeio_S38).naam = "S38" Task(%Aeio_S38).cptr = CODEPTR(Aeio_S38) Task(%Aeio_S38).freq = 4 Task(%Aeio_S38).flags = %False TaskEX(%Aeio_S38).stopCptr = CODEPTR(Aeio_S38_Stop) Task(%Aeio_S39).naam = "S39" Task(%Aeio_S39).cptr = CODEPTR(Aeio_S39) Task(%Aeio_S39).freq = 4 Task(%Aeio_S39).flags = %False TaskEX(%Aeio_S39).stopCptr = CODEPTR(Aeio_S39_Stop) Task(%Aeio_S40).naam = "S40" Task(%Aeio_S40).cptr = CODEPTR(Aeio_S40) Task(%Aeio_S40).freq = 4 Task(%Aeio_S40).flags = %False TaskEX(%Aeio_S40).stopCptr = CODEPTR(Aeio_S40_Stop) Task(%Aeio_S41).naam = "S41" Task(%Aeio_S41).cptr = CODEPTR(Aeio_S41) Task(%Aeio_S41).freq = 4 Task(%Aeio_S41).flags = %False TaskEX(%Aeio_S41).stopCptr = CODEPTR(Aeio_S41_Stop) Task(%Aeio_S42).naam = "S42" Task(%Aeio_S42).cptr = CODEPTR(Aeio_S42) Task(%Aeio_S42).freq = 4 Task(%Aeio_S42).flags = %False TaskEX(%Aeio_S42).stopCptr = CODEPTR(Aeio_S42_Stop) Task(%Aeio_S43).naam = "S43" Task(%Aeio_S43).cptr = CODEPTR(Aeio_S43) Task(%Aeio_S43).freq = 4 Task(%Aeio_S43).flags = %False TaskEX(%Aeio_S43).stopCptr = CODEPTR(Aeio_S43_Stop) Task(%Aeio_S44).naam = "S44" Task(%Aeio_S44).cptr = CODEPTR(Aeio_S44) Task(%Aeio_S44).freq = 4 Task(%Aeio_S44).flags = %False TaskEX(%Aeio_S44).stopCptr = CODEPTR(Aeio_S44_Stop) Task(%Aeio_S45).naam = "S45" Task(%Aeio_S45).cptr = CODEPTR(Aeio_S45) Task(%Aeio_S45).freq = 4 Task(%Aeio_S45).flags = %False TaskEX(%Aeio_S45).stopCptr = CODEPTR(Aeio_S45_Stop) Task(%Aeio_S46).naam = "S46" Task(%Aeio_S46).cptr = CODEPTR(Aeio_S46) Task(%Aeio_S46).freq = 4 Task(%Aeio_S46).flags = %False TaskEX(%Aeio_S46).stopCptr = CODEPTR(Aeio_S46_Stop) Task(%Aeio_S47).naam = "S47" Task(%Aeio_S47).cptr = CODEPTR(Aeio_S47) Task(%Aeio_S47).freq = 4 Task(%Aeio_S47).flags = %False TaskEX(%Aeio_S47).stopCptr = CODEPTR(Aeio_S47_Stop) Task(%Aeio_Finetune).naam = "F-tune" Task(%Aeio_Finetune).cptr = CODEPTR(Aeio_FineTune) Task(%Aeio_Finetune).freq = 4 Task(%Aeio_Finetune).flags = %False TaskEX(%Aeio_Finetune).stopCptr = CODEPTR(Aeio_FineTune_Stop) #ENDIF Task (%uforaeio).naam = "u for Aeio" Task(%uforaeio).cptr = CODEPTR(UForAeio) Task(%uforaeio).freq = 40 TaskEx(%uforaeio).stopcptr = CODEPTR(MC_Scale_Stop) 'just sends ctrl 123.. 'master controller tests: -------------------------------------------- Task(%MC_Scale).naam = "MC_Scale" Task(%MC_Scale).cptr = CODEPTR(MC_Scale) Task(%MC_Scale).freq = 4 Task(%MC_Scale).flags = %False TaskEX(%MC_Scale).stopCptr = CODEPTR(MC_Scale_Stop) Task(%MC_Hammers).naam = "Hammers" Task(%MC_Hammers).cptr = CODEPTR(MC_Hammers) Task(%MC_Hammers).freq = 4 Task(%MC_Hammers).flags = %False TaskEX(%MC_Hammers).stopCptr = CODEPTR(MC_Scale_Stop) 'no mistake! Task(%MC_Note).naam = "MC_Note" Task(%MC_Note).cptr = CODEPTR(MC_Note) Task(%MC_Note).freq = 4 Task(%MC_Note).flags = %False TaskEX(%MC_Note).stopCptr = CODEPTR(MC_Scale_Stop) 'no mistake! Task(%MC_CC7_CC23).naam = "CC7-CC23" 'volumes Task(%MC_CC7_CC23).cptr = CODEPTR(MC_CC7_CC23) Task(%MC_CC7_CC23).freq = 25 Task(%MC_CC7_CC23).flags = %False ' Task(%MC_PWM).naam = "PWM" 'lites ' Task(%MC_PWM).cptr = CODEPTR(MC_PWM) ' Task(%MC_PWM).freq = 20 ' Task(%MC_PWM).flags = %False Task(%MC_Funda).naam = "Funda" 'set fundamental tuning Task(%MC_Funda).cptr = CODEPTR(MC_Funda) Task(%MC_Funda).freq = 4 Task(%MC_Funda).flags = %False Task(%MC_Flag).naam = "Flag" 'flageolets Task(%MC_Flag).cptr = CODEPTR(MC_Flag) Task(%MC_Flag).freq = 16 Task(%MC_Flag).flags = %False TaskEX(%MC_Flag).stopcptr = CODEPTR(MC_Scale_Stop) Task(%MC_Progchange).naam = "Prg" 'prog. change to select f- lookups Task(%MC_ProgChange).cptr = CODEPTR(MC_Progchange) Task(%MC_ProgChange).freq = 1 Task(%MC_ProgChange).flags = %False Task(%Torture).naam = "Torture" 'midi torture task Task(%Torture).cptr = CODEPTR(Torture) Task(%Torture).freq = 100 Task(%Torture).flags = %False Task(%Lite1).naam = "Lite1" 'blue LED Task(%Lite1).cptr = CODEPTR(Lite1) Task(%Lite1).freq = 4.1 Task(%Lite1).flags = %False Task(%Lite2).naam = "Lite2" 'red Task(%Lite2).cptr = CODEPTR(Lite2) Task(%Lite2).freq = 4.2 Task(%Lite2).flags = %False Task(%Lite3).naam = "Lite3" Task(%Lite3).cptr = CODEPTR(Lite3) Task(%Lite3).freq = 4.3 Task(%Lite3).flags = %False Task(%Lite4).naam = "Lite4" 'blue LED Task(%Lite4).cptr = CODEPTR(Lite4) Task(%Lite4).freq = 4.4 Task(%Lite4).flags = %False Task(%Lite5).naam = "Lite5" 'yellow 1W LED Task(%Lite5).cptr = CODEPTR(Lite5) Task(%Lite5).freq = 1 Task(%Lite5).flags = %False Task(%Lite6).naam = "Lite6" 'yellow 1W LED Task(%Lite6).cptr = CODEPTR(Lite6) Task(%Lite6).freq = 1 Task(%Lite6).flags = %False ButnSW(7).tag0 = "AeioCtrl tog" ButnSW(7).tag1 = "AeioCtrl tog" ButnSW(7).cptr = CODEPTR(Aeio_Controlroom) Task(%Aeio_Radar).naam = "Radar" Task(%Aeio_Radar).cptr = CODEPTR(Radar) Task(%Aeio_Radar).freq = 1 Task(%Aeio_Radar).flags = 0 FUNCTION = %True END FUNCTION #IF %DEF(%Aeio_Parser) SUB Aeio_Tuner () STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC velo AS DWORD STATIC i AS BYTE IF ISFALSE Task(%aeio_tune).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamlabels(1) = "Note" IF ISFALSE Task(%aeio_tune).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_tune,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_tune).SliderNumbers(0) Slider(slnr).value = 64 ' 12.5% duty cycle SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_tune).UpdownNumbers(0)).cptr = CODEPTR(Aeio_Tuner_UD) udnr = TaskEX(%aeio_tune).UpDownNumbers(0) UDctrl(udnr).value = %False END IF 'set controllers for e-drivers; 'MM_Aeio_On i = %False Task(%Aeio_Tune).tog = %True END IF IF i <> 36 + Udctrl(udnr).value THEN 'IF i THEN Aeio_Play i, %False ' niet nodig, done in UD callback. 'Aeio_Play (36 + Udctrl(udnr).value, Slider(slnr).value) PLAY Debugport + (i MOD 12), 36, Slider(slnr).value i = 36 + UDctrl(udnr).value velo = Slider(slnr).value ELSEIF velo <> slider(slnr).value THEN 'Aeio_Play 36 + UDctrl(udnr).value, Slider(slnr).value PLAY Debugport+ (i MOD 12), 36, Slider(slnr).value velo = slider(slnr).value END IF task(%Aeio_tune).freq = 20 END SUB FUNCTION Aeio_Tuner_UD () AS LONG ' controls the string to be tuned STATIC noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_tune).UpDownNumbers(0) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 11 THEN UDctrl(udnr).value = 11 IF 36+ UDctrl(udnr).value <> noot THEN PLAY debugport + (36 + UDctrl(udnr).value MOD 12), 36, %False 'Aeio_Play noot, %False ' note off noot = 36 + UDCtrl(udnr).value END IF SetDlgItemText Task(%aeio_tune).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END FUNCTION SUB Aeio_Phase () ' test for controller 3 and 4 : duty cycle STATIC slnr AS LONG LOCAL i AS DWORD IF ISFALSE Task(%aeio_phase).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "cc3" TaskParamlabels(1) = "cc4" IF ISFALSE Task(%aeio_phase).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_phase,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_phase).SliderNumbers(0) Slider(slnr).value = 16 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value slider(slnr+1).value = 16 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF 'MM_Aeio_On Task(%Aeio_Phase).tog = %True END IF IF Aeio.ctrl(3) <> Slider(slnr).value THEN FOR i = 0 TO 11 Controller debugport +i,3, slider(slnr).value NEXT i Aeio.ctrl(3) = Slider(slnr).value END IF IF Aeio.ctrl(4) <> Slider(slnr+1).value THEN FOR i = 0 TO 11 Controller debugport +i, 4, slider(slnr+1).value NEXT i Aeio.ctrl(4) = Slider(slnr+1).value END IF END SUB SUB Aeio_Scale () '26.07.2010: caused 3 e-bow coils to burn out... '06.08.2010: ebows repaired. ' keep controllers 3 & 4 at no more than halfway!!! STATIC cnt AS DWORD STATIC slnr AS LONG IF ISFALSE Task(%aeio_scale).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamlabels(1) = "Velo" IF ISFALSE Task(%aeio_scale).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_scale,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_scale).SliderNumbers(0) Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF 'set controllers for e-drivers; cnt = 35 'MM_Aeio_On Task(%Aeio_Scale).tog = %True END IF IF cnt > 35 THEN Aeio_Play cnt, %False ' note off slider(slnr+1).value INCR cnt IF cnt > 107 THEN cnt = 36 Aeio_Play cnt, slider(slnr+1).value Task(%Aeio_scale).freq = MAX(slider(slnr).value /4, 1) END SUB FUNCTION Aeio_Play (BYVAL note AS BYTE, BYVAL velo AS BYTE) AS SINGLE 'prototype kode voor wat in de besturingsprocessor moet geprogrammeerd worden. DIM aeio_str(0 TO 11) AS STATIC BYTE 'single LOCAL i AS DWORD IF ISFALSE velo THEN 'dit geval handelen we eerst af om de betreffende snaar vrij te maken. ' het unisono geval is hiermee evenwel nog niet goed opgelost! i = %False DO IF aeio_str(i) = note THEN PLAY debugport + i, 36, %False 'Play aeio.channel + i, note, %False Controller debugport + i, 22, 1 ' reset multiplier aeio_str(i) = %False 'snaar vrijgeven! EXIT LOOP END IF INCR i LOOP UNTIL i = 12 EXIT FUNCTION END IF ' velo control: - now symmetric PWM: Controller debugport, 3, 64 * (velo/127) 'gaan op de PIC nooit echt naar 0 Controller debugport, 4, (127- 64) * (velo/127) '64 gives us 12.5% duty cycle SELECT CASE note ' fundamentals: CASE 36 'Controller debugport + 0, 22, 1 ' reset multiplier to fundamental PLAY debugport + 0, 36, velo aeio_str(0) = note CASE 37 'Controller debugport + 1, 22, 1 PLAY debugport + 1, 36, velo aeio_str(1) = note CASE 38 'Controller debugport + 2, 22, 1 PLAY debugport + 2, 36, velo aeio_str(2) = note CASE 39 'Controller debugport + 3, 22, 1 PLAY debugport + 3, 36, velo aeio_str(3) = note CASE 40 'Controller debugport + 4, 22, 1 PLAY debugport + 4, 36, velo aeio_str(4) = note CASE 41 'Controller debugport + 5, 22, 1 PLAY debugport + 5, 36, velo aeio_str(5) = note CASE 42 'Controller debugport + 6, 22, 1 PLAY debugport + 6, 36, velo aeio_str(6) = note CASE 43 'Controller debugport + 7, 22, 1 PLAY debugport + 7, 36, velo aeio_str(7) = note CASE 44 'Controller debugport + 8, 22, 1 PLAY debugport + 8, 36, velo aeio_str(8) = note CASE 45 'Controller debugport + 9, 22, 1 PLAY debugport + 9, 36, velo aeio_str(9) = note CASE 46 'Controller debugport + 10, 22, 1 PLAY debugport + 10, 36, velo aeio_str(10) = note CASE 47 'Controller debugport + 11, 22, 1 PLAY debugport + 11, 36, velo aeio_str(11) = note CASE 48 ' here we can either use the multiplier, or shift the pitch an octave up ' what will give the most precize result? Controller debugport, 22, 2 PLAY debugport, 36, velo aeio_str(0) = note CASE 49 Controller debugport + 1, 22, 2 PLAY debugport + 1, 36, velo aeio_str(1) = note CASE 50 Controller debugport + 2, 22, 2 PLAY debugport + 2, 36, velo aeio_str(2) = note CASE 51 Controller debugport + 3, 22, 2 PLAY debugport + 3, 36, velo aeio_str(3) = note CASE 52 Controller debugport + 4, 22, 2 PLAY debugport + 4, 36, velo aeio_str(4) = note CASE 53 Controller debugport + 5, 22, 2 PLAY debugport + 5, 36, velo aeio_str(5) = note CASE 54 Controller debugport + 6, 22, 2 PLAY debugport + 6, 36, velo aeio_str(6) = note CASE 55 ' dit is de eerste noot die we ook als kwint van de laagste snaar kunnen spelen IF ISFALSE aeio_str(7) THEN Controller debugport + 7, 22, 2 PLAY debugport + 7, 36, velo aeio_str(7) = note ELSEIF ISFALSE aeio_str(0) THEN Controller debugport + 0, 22, 3 ' kwint PLAY debugport + 0, 36, velo aeio_str(0) = note ELSE ' note cannot be played... - signal this to the user! FUNCTION = note END IF CASE 56 IF ISFALSE aeio_str(8) THEN Controller debugport + 8, 22, 2 PLAY debugport + 8, 36, velo aeio_str(8) = note ELSEIF ISFALSE aeio_str(1) THEN Controller debugport + 1, 22, 3 PLAY debugport + 1, 36, velo aeio_str(1) = note ELSE FUNCTION = note END IF CASE 57 IF ISFALSE aeio_str(9) THEN Controller debugport + 9, 22, 2 PLAY debugport + 9, 36, velo aeio_str(9) = note ELSEIF ISFALSE aeio_str(2) THEN Controller debugport + 2, 22, 3 PLAY debugport + 2, 36, velo aeio_str(2) = note ELSE FUNCTION = note END IF CASE 58 IF ISFALSE aeio_str(10) THEN Controller debugport + 10, 22, 2 PLAY debugport + 10, 36, velo aeio_str(10) = note ELSEIF ISFALSE aeio_str(3) THEN Controller debugport + 3, 22, 3 PLAY debugport + 3, 36, velo aeio_str(3) = note ELSE FUNCTION = note END IF CASE 59 IF ISFALSE aeio_str(11) THEN Controller debugport + 11, 22, 2 PLAY debugport + 11, 36, velo aeio_str(11) = note ELSEIF ISFALSE aeio_str(4) THEN Controller debugport + 4, 22, 3 PLAY debugport + 4, 36, velo aeio_str(4) = note ELSE FUNCTION = note END IF CASE 60 ' default: double octave on lowest string IF ISFALSE aeio_str(0) THEN Controller debugport + 0, 22, 4 PLAY debugport + 0, 36, velo aeio_str(11) = note ELSEIF ISFALSE aeio_str(5) THEN Controller debugport + 5, 22, 3 PLAY debugport + 5, 36, velo aeio_str(5) = note ELSE FUNCTION = note END IF CASE 61 ' here we use the double octave overtone as first choice IF ISFALSE aeio_str(1) THEN Controller debugport + 1, 22, 4 PLAY debugport + 1, 36, velo aeio_str(1) = note ELSEIF ISFALSE aeio_str(6) THEN controller debugport + 6, 22, 3 PLAY debugport + 6, 36, velo aeio_str(6) = note ELSE FUNCTION = note END IF CASE 62 IF ISFALSE aeio_str(2) THEN Controller debugport + 2, 22, 4 PLAY debugport + 2, 36, velo aeio_str(2) = note ELSEIF ISFALSE aeio_str(7) THEN controller debugport + 7, 22, 3 PLAY debugport + 7, 36, velo aeio_str(7) = note ELSE FUNCTION = note END IF CASE 63 IF ISFALSE aeio_str(3) THEN Controller debugport + 3, 22, 4 PLAY debugport + 3, 36, velo aeio_str(3) = note ELSEIF ISFALSE aeio_str(8) THEN controller debugport + 8, 22, 3 PLAY debugport + 8, 36, velo aeio_str(8) = note ELSE FUNCTION = note END IF CASE 64 ' this is the fist note that can be played 3 ways IF ISFALSE aeio_str(4) THEN Controller debugport + 4, 22, 4 ' double octave on E PLAY debugport + 4, 36, velo aeio_str(4) = note ELSEIF ISFALSE aeio_str(9) THEN controller debugport + 9, 22, 3 ' fifth on A PLAY debugport + 9, 36, velo aeio_str(9) = note ELSEIF ISFALSE aeio_str(0) THEN controller debugport + 0, 22, 5 ' thirth on C PLAY debugport + 0, 36, velo aeio_str(0) = note ELSE FUNCTION = note END IF CASE 65 ' this note can be played in 3 ways also IF ISFALSE aeio_str(5) THEN Controller debugport + 5, 22, 4 PLAY debugport + 5, 36, velo aeio_str(5) = note ELSEIF ISFALSE aeio_str(10) THEN controller debugport + 10, 22, 3 PLAY debugport + 10, 36, velo aeio_str(10) = note ELSEIF ISFALSE aeio_str(1) THEN controller debugport + 1, 22, 5 PLAY debugport + 1, 36, velo aeio_str(1) = note ELSE FUNCTION = note END IF CASE 66 IF ISFALSE aeio_str(6) THEN Controller debugport + 6, 22, 4 PLAY debugport + 6, 36, velo aeio_str(6) = note ELSEIF ISFALSE aeio_str(11) THEN controller debugport + 11, 22, 3 PLAY debugport + 11, 36, velo aeio_str(11) = note ELSEIF ISFALSE aeio_str(2) THEN controller debugport + 2, 22, 5 PLAY debugport + 2, 36, velo aeio_str(2) = note ELSE FUNCTION = note END IF CASE 67 ' can be played as double octave on G string ' as 6th harmonic on the C string IF ISFALSE aeio_str(7) THEN Controller debugport + 7, 22, 4 PLAY debugport + 7, 36, velo aeio_str(7) = note ELSEIF ISFALSE aeio_str(0) THEN Controller debugport + 0, 22, 6 ' double fifth PLAY debugport + 0, 36, velo aeio_str(0) = note ELSEIF ISFALSE aeio_str(3) THEN controller debugport + 3, 22, 5 PLAY debugport + 3, 36, velo aeio_str(3) = note ELSE FUNCTION = note END IF CASE 68 IF ISFALSE aeio_str(8) THEN Controller debugport + 8, 22, 4 PLAY debugport + 8, 36, velo aeio_str(8) = note ELSEIF ISFALSE aeio_str(1) THEN controller debugport + 1, 22, 6 PLAY debugport + 1, 36, velo aeio_str(1) = note ELSEIF ISFALSE aeio_str(4) THEN controller debugport + 4, 22, 5 PLAY debugport + 4, 36, velo aeio_str(4) = note ELSE FUNCTION = note END IF CASE 69 IF ISFALSE aeio_str(9) THEN Controller debugport + 9, 22, 4 PLAY debugport + 9, 36, velo aeio_str(9) = note ELSEIF ISFALSE aeio_str(2) THEN controller debugport + 2, 22, 6 PLAY debugport + 2, 36, velo aeio_str(2) = note ELSEIF ISFALSE aeio_str(5) THEN controller debugport + 5, 22, 5 PLAY debugport + 5, 36, velo aeio_str(5) = note ELSE FUNCTION = note END IF CASE 70 ' here we have 4 possibilities IF ISFALSE aeio_str(10) THEN Controller debugport + 10, 22, 4 PLAY debugport + 10, 36, velo aeio_str(10) = note ELSEIF ISFALSE aeio_str(3) THEN controller debugport + 3, 22, 6 PLAY debugport + 3, 36, velo aeio_str(3) = note ELSEIF ISFALSE aeio_str(6) THEN controller debugport + 6, 22, 5 PLAY debugport + 6, 36, velo aeio_str(6) = note ELSEIF ISFALSE aeio_str(0) THEN controller debugport + 0, 22, 7 PLAY debugport + 0, 36, velo aeio_str(0) = note ELSE FUNCTION = note END IF CASE 71 ' IF ISFALSE aeio_str(11) THEN Controller debugport + 11, 22, 4 PLAY debugport + 11, 36, velo aeio_str(11) = note ELSEIF ISFALSE aeio_str(4) THEN Controller debugport + 4, 22, 6 PLAY debugport + 4, 36, velo aeio_str(4) = note ELSEIF ISFALSE aeio_str(7) THEN Controller debugport + 7, 22, 5 PLAY debugport + 7, 36, velo aeio_str(7) = note ELSE FUNCTION = note END IF CASE 72 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(0) THEN Controller debugport + 0, 22, 8 PLAY debugport + 0, 36, velo aeio_str(0) = note ELSE FUNCTION = note END IF CASE 73 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(1) THEN Controller debugport + 1, 22, 8 PLAY debugport + 1, 36, velo aeio_str(1) = note ELSE FUNCTION = note END IF CASE 74 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(2) THEN Controller debugport + 2, 22, 8 PLAY debugport + 2, 36, velo aeio_str(2) = note ELSE FUNCTION = note END IF CASE 75 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(3) THEN Controller debugport + 3, 22, 8 PLAY debugport + 3, 36, velo aeio_str(3) = note ELSE FUNCTION = note END IF CASE 76 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(4) THEN Controller debugport + 4, 22, 8 PLAY debugport + 4, 36, velo aeio_str(4) = note ELSE FUNCTION = note END IF CASE 77 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(5) THEN Controller debugport + 5, 22, 8 PLAY debugport + 5, 36, velo aeio_str(5) = note ELSE FUNCTION = note END IF CASE 78 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(6) THEN Controller debugport + 6, 22, 8 PLAY debugport + 6, 36, velo aeio_str(6) = note ELSE FUNCTION = note END IF CASE 79 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(7) THEN Controller debugport + 7, 22, 8 PLAY debugport + 7, 36, velo aeio_str(7) = note ELSE FUNCTION = note END IF CASE 80 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(8) THEN Controller debugport + 8, 22, 8 PLAY debugport + 8, 36, velo aeio_str(8) = note ELSE FUNCTION = note END IF CASE 81 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(9) THEN Controller debugport + 9, 22, 8 PLAY debugport + 9, 36, velo aeio_str(9) = note ELSE FUNCTION = note END IF CASE 82 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(10) THEN Controller debugport + 10, 22, 8 PLAY debugport + 10, 36, velo aeio_str(10) = note ELSE FUNCTION = note END IF CASE 83 ' nog verder aan te vullen met mogelijkheden, maar dan rekening houdend met ' empirische metingen op inharmoniciteit!!! IF ISFALSE aeio_str(11) THEN Controller debugport + 11, 22, 8 PLAY debugport + 11, 36, velo aeio_str(11) = note ELSE FUNCTION = note END IF CASE 84 TO 95 i = note MOD 12 IF ISFALSE aeio_str(i) THEN Controller debugport + i, 22, 16 PLAY debugport + i, 36, velo aeio_str(i) = note ELSE ' to do FUNCTION = note END IF CASE 96 TO 107 i = note MOD 12 IF ISFALSE aeio_str(i) THEN Controller debugport + i, 22, 32 PLAY debugport +i, 36, velo aeio_str(i) = note ELSE FUNCTION = note END IF CASE ELSE 'higher up not implemented yet on the PIC's FUNCTION = note END SELECT END FUNCTION SUB Aeio_Hammers () 'test code for the piano hammers on Aeio, mapped op notes 24 to 35 '27.07.2010: as yet the required coding is not yet implemented in the PIC firmware. ' moreover, this makes the ebows active! ' meaning that the lowest note on the dsPIC boards is not limited to 36 now! ' ===> PIC bug! STATIC slnr, udnr, cnt AS LONG LOCAL velo, damp AS LONG IF ISFALSE task(%Aeio_Hammers).tog THEN DIM TaskParamLabels(4) AS ASCIIZ * 8 TaskParamLabels(0) = "Velo" 'striking force TaskParamLabels(1) = "Damp" 'damping force TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Note" IF ISFALSE Task(%aeio_Hammers).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_hammers,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_hammers).SliderNumbers(0) Slider(slnr).value = 32 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'damping SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_hammers).UpdownNumbers(0)).cptr = CODEPTR(Aeio_Hammers_UD) udnr = TaskEX(%aeio_hammers).UpDownNumbers(0) UDctrl(udnr).value = 24 UDctrl(udnr).maxval = 35 UDctrl(udnr).minval = 24 UDctrl(udnr).resetval = 24 END IF RESET cnt Task(%Aeio_Hammers).tog = %True END IF velo = Slider(slnr).value damp = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN 'note on: PLAY debugport + (UDctrl(udnr).value MOD 12), 24, velo 'for now all hammers respond to note 24 'on the dsPIC board firmware level 'since they have identical code. ELSE IF damp THEN IF ISFALSE Aeio.ctrl(65) THEN 'enable release damping Aeio.ctrl(65) = %True Controller debugport + (UDctrl(udnr).value MOD 12),65, %True END IF Release debugport + (UDctrl(udnr).value MOD 12), 24, damp ELSE 'no damping IF Aeio.ctrl(65) THEN RESET Aeio.ctrl(65) Controller debugport + (UDctrl(udnr).value MOD 12),65, %False END IF END IF 'Play debugport + (UDctrl(udnr).value MOD 12), 24, %False 'note-off is not required for the hammers. END IF INCR cnt Task(%aeio_hammers).freq = MAX(Slider(slnr+2).value / 8, 0.25) END SUB SUB Aeio_Hammers_UD () ' controls the note STATIC note AS BYTE LOCAL udnr AS DWORD IF note THEN NoteOff debugport + (note MOD 12), note 'on any change, always switch of the previous note udnr = TaskEX(%aeio_hammers).UpDownNumbers(0) note = UDctrl(udnr).value SetDlgItemText Task(%aeio_hammers).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(note) END SUB SUB Aeio_S36 () ' DO snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S36).tog THEN controller debugport, 69, 64 'ebow ON controller debugport, 24, 0 'tuning controller debugport, 22, 1 'flageolet controller debugport, 20, 40 'set note to 36 'range for this controller is 24-60 'controller debugport, 3, 32 'time A Phase 'controller debugport, 4, 32 'time B Phase DIM TaskParamLabels(4) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier 'we could add one UD for Hammer striking and another one for damping TaskParamLabels(4) = "Okt" 'experiment. -ctrl 20 IF ISFALSE Task(%aeio_S36).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S36,3,Slider(),2,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S36).SliderNumbers(0) Slider(slnr).value = 2 'level 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S36).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S36_UD) udnr = TaskEX(%aeio_S36).UpDownNumbers(0) UDctrl(udnr).value = 1 UDctrl(udnr+1).cptr = CODEPTR(Aeio_S36_Okt_UD) UDctrl(udnr+1).value = 1 END IF RESET cnt Task(%Aeio_S36).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN 'note on: 'Play debugport, 36, Slider(slnr).value - in this version 1.0 of the firmware velo is not implemented ' thus we use controllers 3 and 4 to this purpose Controller debugport, 3, WAVE * (velo/127) 'gaan op de PIC nooit echt naar 0 Controller debugport, 4, (127-WAVE) * (velo/127) PLAY debugport, 36, 127 'the velo byte is not yet used in the PIC 'with hammer excitation this should become: 'Play debugport, 24, striking_force ELSE PLAY debugport, 36, %False 'with release control over the dampers this should become: 'Release debugport, 36, release_Force END IF INCR cnt Task(%aeio_S36).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S36_UD () ' controls the overtone number - in the firmware implemented up to 32. STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S36).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport, 22, har SetDlgItemText Task(%aeio_S36).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S36_Okt_UD () ' controls the fundamental pitch - in the firmware implemented from 24 to 60 STATIC okt AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S36).UpDownNumbers(1) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 3 THEN UDctrl(udnr).value = 3 okt = 28 + (UDctrl(udnr).value * 12) 'was 24 + Controller debugport, 20, okt SetDlgItemText Task(%aeio_S36).hparam, %GMT_TEXT0_ID + 17, "o=" & STR$(okt) END SUB SUB Aeio_S36_Stop () PLAY debugport, 36, %False Controller debugport, 20, 40 '36 'reset! END SUB SUB Aeio_S37 () 'DO# snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S37).tog THEN controller debugport+1, 69, 64 'ebow ON controller debugport+1, 24, 0 'tuning controller debugport+1, 22, 1 'flageolet controller debugport+1, 20, 41 'set note to 37 'controller debugport+1, 3, 32 'time A Phase 'controller debugport+1, 4, 32 'time B Phase DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S37).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S37,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S37).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S37).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S37_UD) udnr = TaskEX(%aeio_S37).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S37).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+1, 3, WAVE * (velo/127) Controller debugport+1, 4, (127-WAVE) * (velo/127) PLAY debugport+1, 36, 127 ELSE PLAY debugport+1, 36, %False END IF INCR cnt Task(%aeio_S37).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S37_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S37).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+1, 22, har SetDlgItemText Task(%aeio_S37).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S37_Stop () PLAY debugport+1, 36, %False END SUB SUB Aeio_S38 () 'RE snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S38).tog THEN controller debugport+2, 69, 64 'ebow ON controller debugport+2, 24, 0 'tuning controller debugport+2, 22, 1 'flageolet controller debugport+2, 20, 42 'set note to 38 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S38).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S38,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S38).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S38).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S38_UD) udnr = TaskEX(%aeio_S38).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S38).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+2, 3, WAVE * (velo/127) Controller debugport+2, 4, (127-WAVE) * (velo/127) PLAY debugport+2, 36, 127 ELSE PLAY debugport+2, 36, %False END IF INCR cnt Task(%aeio_S38).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S38_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S38).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+2, 22, har SetDlgItemText Task(%aeio_S38).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S38_Stop () PLAY debugport+2, 36, %False END SUB SUB Aeio_S39 () ' MIb snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S39).tog THEN controller debugport+3, 69, 64 'ebow ON controller debugport+3, 24, 0 'tuning controller debugport+3, 22, 1 'flageolet controller debugport+3, 20, 43 'set note to 39 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S39).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S39,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S39).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S39).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S39_UD) udnr = TaskEX(%aeio_S39).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S39).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+3, 3, WAVE * (velo/127) Controller debugport+3, 4, (127-WAVE) * (velo/127) PLAY debugport+3, 36, 127 ELSE PLAY debugport+3, 36, %False END IF INCR cnt Task(%aeio_S39).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S39_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S39).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+3, 22, har SetDlgItemText Task(%aeio_S39).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S39_Stop () PLAY debugport+3, 36, %False END SUB SUB Aeio_S40 () 'MI snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S40).tog THEN controller debugport+4, 69, 64 'ebow ON controller debugport+4, 24, 0 'tuning controller debugport+4, 22, 1 'flageolet controller debugport+4, 20, 44 'set note to 40 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S40).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S40,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S40).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S40).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S40_UD) udnr = TaskEX(%aeio_S40).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S40).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+4, 3, WAVE * (velo/127) Controller debugport+4, 4, (127-WAVE) * (velo/127) PLAY debugport+4, 36, 127 ELSE PLAY debugport+4, 36, %False END IF INCR cnt Task(%aeio_S40).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S40_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S40).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+4, 22, har SetDlgItemText Task(%aeio_S40).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S40_Stop () PLAY debugport+4, 36, %False END SUB SUB Aeio_S41 () 'FA snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S41).tog THEN controller debugport+5, 69, 64 'ebow ON controller debugport+5, 24, 0 'tuning controller debugport+5, 22, 1 'flageolet controller debugport+5, 20, 45 'set note to 41 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S41).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S41,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S41).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S41).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S41_UD) udnr = TaskEX(%aeio_S41).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S41).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+5, 3, WAVE * (velo/127) Controller debugport+5, 4, (127-WAVE) * (velo/127) PLAY debugport+5, 36, 127 ELSE PLAY debugport+5, 36, %False END IF INCR cnt Task(%aeio_S41).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S41_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S41).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+5, 22, har SetDlgItemText Task(%aeio_S41).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S41_Stop () PLAY debugport+5, 36, %False END SUB SUB Aeio_S42 () 'FA# snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S42).tog THEN controller debugport+6, 69, 64 'ebow ON controller debugport+6, 24, 0 'tuning controller debugport+6, 22, 1 'flageolet controller debugport+6, 20, 46 'set note to 42 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S42).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S42,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S42).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S42).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S42_UD) udnr = TaskEX(%aeio_S42).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S42).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+6, 3, WAVE * (velo/127) Controller debugport+6, 4, (127-WAVE) * (velo/127) PLAY debugport+6, 36, 127 ELSE PLAY debugport+6, 36, %False END IF INCR cnt Task(%aeio_S42).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S42_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S42).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+6, 22, har SetDlgItemText Task(%aeio_S42).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S42_Stop () PLAY debugport+6, 36, %False END SUB SUB Aeio_S43 () 'SOL snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S43).tog THEN controller debugport+7, 69, 64 'ebow ON controller debugport+7, 24, 0 'tuning controller debugport+7, 22, 1 'flageolet controller debugport+7, 20, 47 'set note to 43 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S43).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S43,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S43).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S43).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S43_UD) udnr = TaskEX(%aeio_S43).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S43).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+7, 3, WAVE * (velo/127) Controller debugport+7, 4, (127-WAVE) * (velo/127) PLAY debugport+7, 36, 127 ELSE PLAY debugport+7, 36, %False END IF INCR cnt Task(%aeio_S43).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S43_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S43).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+7, 22, har SetDlgItemText Task(%aeio_S43).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S43_Stop () PLAY debugport+7, 36, %False END SUB SUB Aeio_S44 () 'SOL# snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S44).tog THEN controller debugport+8, 69, 64 'ebow ON controller debugport+8, 24, 0 'tuning controller debugport+8, 22, 1 'flageolet controller debugport+8, 20, 48 'set note to 44 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S44).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S44,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S44).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S44).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S44_UD) udnr = TaskEX(%aeio_S44).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S44).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+8, 3, WAVE * (velo/127) Controller debugport+8, 4, (127-WAVE) * (velo/127) PLAY debugport+8, 36, 127 ELSE PLAY debugport+8, 36, %False END IF INCR cnt Task(%aeio_S44).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S44_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S44).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+8, 22, har SetDlgItemText Task(%aeio_S44).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S44_Stop () PLAY debugport+8, 36, %False END SUB SUB Aeio_S45 () 'LA snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S45).tog THEN controller debugport+9, 69, 64 'ebow ON controller debugport+9, 24, 0 'tuning controller debugport+9, 22, 1 'flageolet controller debugport+9, 20, 49 'set note to 45 - PIC must have bug, since it sounds note 41 instead DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S45).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S45,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S45).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S45).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S45_UD) udnr = TaskEX(%aeio_S45).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S45).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+9, 3, WAVE * (velo/127) Controller debugport+9, 4, (127-WAVE) * (velo/127) PLAY debugport+9, 36, 127 ELSE PLAY debugport+9, 36, %False END IF INCR cnt Task(%aeio_S45).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S45_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S45).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+9, 22, har SetDlgItemText Task(%aeio_S45).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S45_Stop () PLAY debugport+9, 36, %False END SUB SUB Aeio_S46 () 'Sib snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S46).tog THEN controller debugport+10, 69, 64 'ebow ON controller debugport+10, 24, 0 'tuning controller debugport+10, 22, 1 'flageolet controller debugport+10, 20, 50 'set note to 46 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S46).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S46,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S46).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S46).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S46_UD) udnr = TaskEX(%aeio_S46).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S46).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+10, 3, WAVE * (velo/127) Controller debugport+10, 4, (127-WAVE) * (velo/127) PLAY debugport+10, 36, 127 ELSE PLAY debugport+10, 36, %False END IF INCR cnt Task(%aeio_S46).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S46_UD () ' controls the overtone number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S46).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+10, 22, har SetDlgItemText Task(%aeio_S46).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S46_Stop () PLAY debugport+10, 36, %False END SUB SUB Aeio_S47 () 'Si snaar STATIC slnr, udnr, cnt AS LONG LOCAL velo, WAVE AS LONG IF ISFALSE task(%Aeio_S47).tog THEN controller debugport+11, 69, 64 'ebow ON controller debugport+11, 24, 0 'tuning controller debugport+11, 22, 1 'flageolet controller debugport+11, 20, 51 'set note to 47 DIM TaskParamLabels(3) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "W-Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% TaskParamLabels(2) = "Tempo" TaskParamlabels(3) = "Flageol" 'multiplier IF ISFALSE Task(%aeio_S47).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_S47,3,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_S47).SliderNumbers(0) Slider(slnr).value = 2 'level SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_S47).UpdownNumbers(0)).cptr = CODEPTR(Aeio_S47_UD) udnr = TaskEX(%aeio_S47).UpDownNumbers(0) UDctrl(udnr).value = 1 END IF RESET cnt Task(%Aeio_S47).tog = %True END IF velo = Slider(slnr).value WAVE = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN Controller debugport+11, 3, WAVE * (velo/127) Controller debugport+11, 4, (127-WAVE) * (velo/127) PLAY debugport+11, 36, 127 ELSE PLAY debugport+11, 36, %False END IF INCR cnt Task(%aeio_S47).freq = MAX(Slider(slnr+2).value / 32, 0.05) END SUB SUB Aeio_S47_UD () ' controls the overtone number (frequency multiplier) STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_S47).UpDownNumbers(0) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 32 THEN UDctrl(udnr).value = 32 har = UDctrl(udnr).value Controller debugport+11, 22, har SetDlgItemText Task(%aeio_S47).hparam, %GMT_TEXT0_ID + 16, "X=" & STR$(har) END SUB SUB Aeio_S47_Stop () PLAY debugport+11, 36, %False END SUB SUB Aeio_FineTune () 'controller 24 test STATIC slnr, udnr, pitch, oldnote AS DWORD STATIC i AS BYTE IF ISFALSE Task(%aeio_finetune).tog THEN DIM TaskParamLabels(1) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Pitch" TaskParamlabels(1) = "Note" IF ISFALSE Task(%aeio_finetune).hParam THEN slnr = %False MakeTaskParameterDialog %aeio_finetune,1,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%aeio_finetune).SliderNumbers(0) Slider(slnr).value = 0 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%aeio_finetune).UpdownNumbers(0)).cptr = CODEPTR(Aeio_FineTune_UD) udnr = TaskEX(%aeio_finetune).UpDownNumbers(0) UDctrl(udnr).value = %False END IF 'set controllers for e-drivers; MM_Aeio_On i = %False Task(%Aeio_FineTune).tog = %True END IF IF i <> 36 + Udctrl(udnr).value THEN IF oldnote THEN PLAY debugport + (oldnote MOD 12), oldnote, %False oldnote = %False END IF IF i <> oldnote THEN i = 36 + UDctrl(udnr).value PLAY debugport+ (i MOD 12), i, 127 oldnote = i END IF END IF IF slider(slnr).value <> pitch THEN pitch = slider(slnr).value Controller debugport + (i MOD 12), 24, pitch END IF task(%Aeio_finetune).freq = 20 END SUB SUB Aeio_FineTune_UD () ' controls the string to be tuned STATIC noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%aeio_finetune).UpDownNumbers(0) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 11 THEN UDctrl(udnr).value = 11 IF 36+ UDctrl(udnr).value <> noot THEN 'Aeio_Play noot, %False ' note off - not working properly noot = 36 + UDCtrl(udnr).value END IF SetDlgItemText Task(%aeio_finetune).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END SUB SUB Aeio_FineTune_Stop () 'reset the fine tune controllers on exit. LOCAL i AS LONG FOR i = 0 TO 11 Controller debugport + i, 24, %False PLAY debugport + i, 36 + i, %False 'notes off NEXT i END SUB #ENDIF '********************************************************************************************************** ' design procs. FUNCTION String_Freq (BYVAL length AS SINGLE, BYVAL force AS SINGLE, BYVAL dens AS SINGLE) EXPORT AS SINGLE ' basisformule akoestiek FUNCTION = (1! / (length * 2!) ) * SQR(force / dens) END FUNCTION FUNCTION String_Force (BYVAL noot AS SINGLE, BYVAL d AS SINGLE, BYVAL length AS SINGLE, BYVAL sg AS SINGLE) EXPORT AS SINGLE ' returns the force in Newton stretching a string if the pitch is known ' force in Newton ' d in mm (diameter van de snaar) ' sg in kg/kubieke dm = kg/l ==> 1m3 = 1000 * sg ' length in m LOCAL dens AS SINGLE ' densiteit in kg per meter lengte LOCAL r AS SINGLE LOCAL freq AS SINGLE r = (d / 2!) / 1000! ' convert to meter dens = sg * Pi * (r ^2) * 1E3 freq = N2F(noot) FUNCTION = (freq ^2) * dens / ((1/(length * 2))^2) END FUNCTION FUNCTION String_Gage (BYVAL noot AS SINGLE, BYVAL length AS SINGLE, BYVAL sg AS SINGLE, BYVAL force AS SINGLE) EXPORT AS SINGLE ' returns the diameter of the string you would need, in mm ' on input units are: noot - midi ' length - meters ' sg - kg/l ' force - newton LOCAL freq AS SINGLE freq = N2F(noot) FUNCTION = 2000 * ((( 0.5 / length) / freq) * SQR(force/ (sg * Pi * 1E3)) ) END FUNCTION SUB FillStringType (s AS stringtype) ' calculates missing params. - checks for impossibilities. ' either diameter or cross section should be known IF ISFALSE s.opp THEN IF s.diam THEN s.opp = Pi * (s.diam /2) ^ 2 ' in mm2 END IF ' materiaalkonstanten: IF s.sg THEN IF s.sg > 23 THEN MSGBOX "Error: impossibly heavy material used" IF s.sg < 1 THEN MSGBOX "Error: too light material for string " 'sg AS SINGLE ' soortelijke massa van het snaarmateriaal kg/l END IF IF s.comp <> "" THEN s.sg = GetMass (s.comp) IF ISFALSE s.freq(1) THEN IF s.noot(1) THEN s.freq(1) = N2F(s.noot(1)) END IF IF ISFALSE s.noot(1) THEN IF s.freq(1) THEN s.noot(1) = F2NF(s.freq(1)) END IF ' dens AS SINGLE ' densiteit in kg/m lengte ' diam AS SINGLE ' diameter in mm ' opp AS SINGLE ' oppervlakte van de doorsnede (mm^2) ' breuk AS SINGLE ' breukgrens in Newton , tensile strength ' trekgrens AS SINGLE ' maximale trekkracht per mm2 bij breuk (N/mm2) (trekvastheid) ' ' parameters ' force AS SINGLE ' spankracht in Newton op de snaar (N) ' trek AS SINGLE ' trekkracht per oppervlakte eenheid (N/mm2) ' noot() AS SINGLE ' fractional midi noot ' freq() AS SINGLE ' frekwentie (Hz) ' length AS SINGLE ' trillende lengte van de snaar (m) END SUB FUNCTION GetMass (s AS STRING * 8) EXPORT AS SINGLE '/ dichtheden: / soortelijke massa elementen LOCAL c1 AS STRING LOCAL c2 AS STRING c2 = UCASE$(LEFT$(s,2)) c1 = UCASE$(LEFT$(s,1)) IF LEN(c2) = 2 THEN SELECT CASE c2 CASE "FE" FUNCTION = 7.87 ' staal CASE "CU" FUNCTION = 8.96 ' koper CASE "NI" FUNCTION = 8.91 ' nikkel CASE "SN" FUNCTION = 7.29 ' tin CASE "ZN" FUNCTION = 7.13 ' zink CASE "PB" FUNCTION = 11.3 ' lood CASE "AU" FUNCTION = 19.3 ' goud CASE "SI" FUNCTION = 2.33 ' silicium CASE "IR" FUNCTION = 22.4 ' iridium - lijkt ideaal voor omwikkelingen van snaren. CASE "MG" FUNCTION = 1.74 ' magnesium CASE "MN" FUNCTION = 7.43 ' mangaan CASE "MO" FUNCTION = 10.22 ' molybdeen CASE "NA" FUNCTION = 0.97 ' natrium MSGBOX "Sodium cannot be used for strings..." CASE "PT" FUNCTION = 21.5 ' platina CASE "AG" FUNCTION = 10.5 ' zilver CASE "TA" FUNCTION = 16.6 ' tantaal CASE "TI" FUNCTION = 4.5 ' titaan CASE "SE" FUNCTION = 4.4 ' seleen CASE "HE","AR","NE","XE","RD" ,"KR" MSGBOX "These elements cannot be used for strings..." FUNCTION = 0 CASE ELSE FUNCTION = 0 MSGBOX "Unknown element" END SELECT ELSE SELECT CASE c1 CASE "C" FUNCTION = 3.5 ' koolstof CASE "S" FUNCTION = 2.07 ' zwavel CASE "U" FUNCTION = 19.1 ' uranium CASE "V" FUNCTION = 6.12 ' vanadium CASE "W" FUNCTION = 19.27 ' wolfram / tungsten CASE "K" FUNCTION = 0 MSGBOX "This element cannot be used for strings..." CASE "O", "N" , "F", "H" MSGBOX "This element cannot be made into a string...." FUNCTION = 0 CASE ELSE MSGBOX "Unknown element..." FUNCTION = 0 END SELECT END IF END FUNCTION FUNCTION String_Get_B_Param (snaar AS StringType) AS SINGLE LOCAL r AS SINGLE LOCAL k AS SINGLE LOCAL lambda AS SINGLE r = (snaar.diam/2) / 1000 k = ((r^2)* snaar.em) / (4 * snaar.sg) lambda = k / (snaar.c^2) FUNCTION = (lambda * (Pi^2) / (snaar.length^2)) / 1000 END FUNCTION '----------------------------------------------------------------------------------------- 'test code for the master controller (parser PIC) SUB MC_Scale () STATIC cnt, oldnote AS DWORD STATIC slnr, udnr AS LONG IF ISFALSE Task(%MC_scale).tog THEN DIM TaskParamLabels(5) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamlabels(1) = "Velo" TaskParamLabels(2) = "Release" TaskParamLabels(3) = "High" TaskParamLabels(4) = "Low" TaskParamlabels(5) = "Sustain" IF ISFALSE Task(%MC_scale).hParam THEN slnr = %False MakeTaskParameterDialog %MC_scale,3,Slider(),3,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_scale).SliderNumbers(0) Slider(slnr).value = 8 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value udnr = TaskEX(%MC_scale).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(MC_Aeio_High_UD) UDctrl(udnr+1).cptr = CODEPTR(MC_Aeio_Low_UD) UDctrl(udnr+2).cptr = CODEPTR(MC_Aeio_Sustain_UD) Udctrl(udnr).minval = 36 UDctrl(udnr).maxval = 127 UDctrl(udnr).value = 84 Udctrl(udnr+1).minval = 36 UDctrl(udnr+1).maxval = 127 UDctrl(udnr+1).value = 36 UDctrl(udnr+2).value = 0 UDctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = 1 END IF cnt = UDctrl(udnr+1).value -1 MM_Aeio_On ' sends Controller 66 Task(%MC_Scale).tog = %True END IF IF oldnote THEN Release Aeio.channel, oldnote, Slider(slnr+2).value 'release is implemented! oldnote = %False END IF INCR cnt IF cnt < UDctrl(udnr+1).value THEN cnt = UDctrl(udnr+1).value IF cnt > UDctrl(udnr).value THEN cnt = UDctrl(udnr+1).value mPlay Aeio.channel, cnt, slider(slnr+1).value oldnote = cnt Task(%MC_scale).freq = MAX(slider(slnr).value /4, 1) END SUB FUNCTION MC_Aeio_High_UD () AS LONG ' controls the highest note for the scale STATIC note AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Scale).UpDownNumbers(0) note = UDctrl(udnr).value IF note < UDctrl(udnr+1).value THEN UDctrl(udnr).value = UDctrl(udnr+1).value END IF SetDlgItemText Task(%MC_Scale).hparam, %GMT_TEXT0_ID + 16, "H=" & STR$(note) END FUNCTION FUNCTION MC_Aeio_Low_UD () AS LONG ' controls the lowest note for the scale STATIC note AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Scale).UpDownNumbers(1) note = UDctrl(udnr).value IF note > UDctrl(udnr-1).value THEN UDctrl(udnr).value = UDctrl(udnr-1).value END IF SetDlgItemText Task(%MC_Scale).hparam, %GMT_TEXT0_ID + 17, "L=" & STR$(note) END FUNCTION FUNCTION MC_Aeio_Sustain_UD () AS LONG ' controls the sustain controller STATIC n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Scale).UpDownNumbers(2) n = UDctrl(udnr).value IF n > 0 THEN UDctrl(udnr).value = 1 n = 64 ELSE UDctrl(udnr).value = 0 n = 0 END IF SetDlgItemText Task(%MC_Scale).hparam, %GMT_TEXT0_ID + 18, "S=" & STR$(n) END FUNCTION SUB MC_Scale_Stop () Controller aeio.channel, 123, %False END SUB SUB MC_Hammers () 'test for the hammers only '11.09.2010 implemented on the dsPIC's 'dsPIC pulse velo scaling: 0.5ms to 64ms STATIC cnt AS DWORD STATIC slnr AS LONG IF ISFALSE Task(%MC_hammers).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" TaskParamlabels(1) = "Velo" IF ISFALSE Task(%MC_hammers).hParam THEN slnr = %False MakeTaskParameterDialog %MC_hammers,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_hammers).SliderNumbers(0) Slider(slnr).value = 4 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF cnt = 23 Task(%MC_Hammers).tog = %True END IF INCR cnt IF cnt > 35 THEN cnt = 24 mPlay Aeio.channel, cnt, slider(slnr+1).value Task(%MC_hammers).freq = MAX(slider(slnr).value / 16, 1) END SUB SUB MC_Note () ' individual note test on Aeio ' extended 24.10.2017 - gwr STATIC slnr, udnr, cnt , oldnote, oldwave AS LONG LOCAL velo, Wav AS LONG IF ISFALSE task(%MC_Note).tog THEN DIM TaskParamLabels(7) AS STATIC ASCIIZ * 8 TaskParamLabels(0) = "Level" 'velo TaskParamLabels(1) = "Sym" 'Ta - Tb proportion of the two PWM drive signals. 64= 50% , ctrl 23 TaskParamLabels(2) = "Tempo" TaskParamLabels(3) = "Release" TaskParamlabels(4) = "Note" TaskParamLabels(5) = "Ham" 'hammer force TaskParamlabels(6) = "#65" TaskParamlabels(7) = "#64" ' sustain IF ISFALSE Task(%MC_Note).hParam THEN slnr = %False MakeTaskParameterDialog %MC_Note,4,Slider(),4,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_Note).SliderNumbers(0) Slider(slnr).value = 20 'level - velo SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 'default 50% duty cycle cc23 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value slider(slnr+3).value = 0 ' release speed 0 on startup sendmessage Slider(slnr+3).h, %TBM_SETPOS, %True, Slider(slnr+3).value END IF IF ISFALSE udnr THEN udnr = TaskEX(%MC_Note).UpDownNumbers(0) UDctrl(TaskEX(%MC_Note).UpdownNumbers(0)).cptr = CODEPTR(MC_Note_Ud) UDctrl(udnr).value = 36 'hammers: UDCtrl(udnr+1).cptr = CODEPTR(MC_Ham_Ud) UDctrl(udnr+1).value = 5 'Ctrl65: UDCtrl(udnr+2).cptr = CODEPTR(MC_CC65_UD) UDctrl(udnr+2).value = 1 UDCtrl(udnr+2).minval = 0 UDCtrl(udnr+2).maxval = 1 'Ctrl64: UDCtrl(udnr+3).cptr = CODEPTR(MC_CC64_UD) UDctrl(udnr+3).value = 0 UDCtrl(udnr+3).minval = 0 UDCtrl(udnr+3).maxval = 1 END IF RESET cnt Task(%MC_Note).tog = %True END IF velo = Slider(slnr).value WAV = Slider(slnr+1).value IF ISFALSE cnt MOD 2 THEN oldnote = UDctrl(udnr).value IF oldwave <> WAV THEN Controller Aeio.channel, 30 + (oldnote MOD 12), WAV 'symmetry for each string different (CC30-41) oldwave = WAV END IF 'note on: mPlay Aeio.channel, oldnote, velo 'with hammer excitation this should become: IF UDctrl(udnr+1).value > 0 THEN mPlay Aeio.channel, 24 + (oldnote MOD 12), UDCtrl(udnr+1).value 'striking_force END IF ELSE IF oldnote THEN Release Aeio.channel, oldnote, slider(slnr+3).value oldnote = %False END IF INCR cnt Task(%MC_Note).freq = MAX(Slider(slnr+2).value / 16, 0.1) END SUB SUB MC_Note_UD () ' controls the note number STATIC har AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Note).UpDownNumbers(0) IF UDctrl(udnr).value < 36 THEN UDctrl(udnr).value = 36 IF UDctrl(udnr).value > 127 THEN UDctrl(udnr).value = 127 har = UDctrl(udnr).value SetDlgItemText Task(%MC_Note).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(har) END SUB SUB MC_Ham_UD () ' controls the hammer force (hammer velocity byte) STATIC ham AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Note).UpDownNumbers(1) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 127 THEN UDctrl(udnr).value = 127 ham = UDctrl(udnr).value SetDlgItemText Task(%MC_Note).hparam, %GMT_TEXT0_ID + 17, "H=" & STR$(ham) END SUB SUB MC_CC65_UD () LOCAL udnr AS DWORD udnr = TaskEX(%MC_Note).UpDownNumbers(2) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value = 0 THEN controller Aeio.channel, 65, 0 ELSE controller Aeio.channel, 65, 64 END IF SetDlgItemText Task(%MC_Note).hparam, %GMT_TEXT0_ID + 18, STR$(UDctrl(udnr).value) END SUB SUB MC_CC64_UD () ' sustain switch LOCAL udnr AS DWORD udnr = TaskEX(%MC_Note).UpDownNumbers(3) IF UDctrl(udnr).value < 0 THEN UDctrl(udnr).value = 0 IF UDctrl(udnr).value > 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value = 0 THEN controller Aeio.channel, 64, 0 ELSE controller Aeio.channel, 64, 64 END IF SetDlgItemText Task(%MC_Note).hparam, %GMT_TEXT0_ID + 19, STR$(UDctrl(udnr).value) END SUB SUB MC_CC7_CC23 () 'sound level controls STATIC slnr AS LONG IF ISFALSE Task(%MC_CC7_CC23).tog THEN DIM TaskParamLabels(1) AS ASCIIZ * 8 TaskParamLabels(0) = "CC7" 'master volume TaskParamlabels(1) = "CC23" 'drive symmetry IF ISFALSE Task(%MC_CC7_CC23).hParam THEN slnr = %False MakeTaskParameterDialog %MC_CC7_CC23,2,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_CC7_CC23).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Controller Aeio.channel, 7, 64 Slider(slnr+1).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr+1).value Controller Aeio.channel, 23, 64 Aeio.ctrl(7) = 64 Aeio.ctrl(23) = 64 END IF Task(%MC_CC7_CC23).tog = %True END IF IF Slider(slnr).value <> Aeio.ctrl(7) THEN Aeio.ctrl(7) = Slider(slnr).value Controller Aeio.channel, 7, Aeio.ctrl(7) END IF IF Slider(slnr+1).value <> Aeio.ctrl(23) THEN Aeio.ctrl(23) = Slider(slnr+1).value Controller Aeio.channel, 23, Aeio.ctrl(23) END IF Task(%MC_CC7_CC23).freq = 25 END SUB 'SUB MC_PWM () ' 'dimable lights ' 'as of 10.2017 no longer implemented. ' STATIC slnr AS LONG ' IF ISFALSE Task(%MC_PWM).tog THEN ' DIM TaskParamLabels(1) AS ASCIIZ * 8 ' TaskParamLabels(0) = "CC5" ' TaskParamlabels(1) = "CC6" ' IF ISFALSE Task(%MC_PWM).hParam THEN ' slnr = %False ' MakeTaskParameterDialog %MC_PWM,2,Slider(),0,UDctrl(),TaskParamLabels() ' END IF ' IF ISFALSE slnr THEN ' slnr = TaskEX(%MC_PWM).SliderNumbers(0) ' Slider(slnr).value = 0 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value ' Controller Aeio.channel, 5, 0 ' Slider(slnr+1).value = 0 ' SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr+1).value ' Controller Aeio.channel, 6, 0 ' Aeio.ctrl(1) = 0 ' Aeio.ctrl(2) = 0 ' END IF ' Task(%MC_PWM).tog = %True ' END IF ' IF Slider(slnr).value <> Aeio.ctrl(5) THEN ' Aeio.ctrl(5) = Slider(slnr).value ' Controller Aeio.channel, 5, Aeio.ctrl(5) ' END IF ' IF Slider(slnr+1).value <> Aeio.ctrl(6) THEN ' Aeio.ctrl(6) = Slider(slnr+1).value ' Controller Aeio.channel, 6, Aeio.ctrl(6) ' END IF ' Task(%MC_PWM).freq = 20 'END SUB SUB MC_Funda () 'sends the fundamental tuning to the parser, using CC50-61 'the twelve dsPICs uses CC20 for this. 'This is a very bad procedure, as with the slider we are continuously sending 'all in-between values, thus bringing the parser into trouble. 'On a reset, the aeio parses sets the tunings to 64, 65, 66,...75, in order to get the 'tuning to be 36-47. 'Users should normally never interfere with these controllers. This procedure is only 'for firmware debugging and tests. STATIC slnr AS LONG LOCAL i AS LONG IF ISFALSE Task(%MC_Funda).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Funda" 'TaskParamlabels(1) = "CC20" IF ISFALSE Task(%MC_Funda).hParam THEN slnr = %False MakeTaskParameterDialog %MC_Funda,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_Funda).SliderNumbers(0) Slider(slnr).value = 64 Slider(slnr).maxval = 76 '52 '?65 Slider(slnr).minval = 40 Aeio.ctrl(2) = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%MC_Funda).tog = %True END IF IF Slider(slnr).value <> Aeio.ctrl(20) THEN Aeio.ctrl(20) = Slider(slnr).value FOR i = 0 TO 11 Aeio.ctrl(50+i) = Aeio.ctrl(20) + i Controller Aeio.channel, 50+i, Aeio.ctrl(50+i) NEXT i END IF Task(%MC_Funda).freq = 1 END SUB SUB MC_Flag () 'test for the string flageolets 07.09.2010 - gwr 'can be used for tuning as well 'extended 12.09.2010 STATIC slnr AS DWORD STATIC udnr AS DWORD STATIC velo AS DWORD STATIC i, f, t AS BYTE IF ISFALSE Task(%MC_Flag).tog THEN DIM TaskParamLabels(3) AS ASCIIZ * 8 TaskParamLabels(0) = "Level" TaskParamLabels(1) = "F-Tune" 'fine tune, bipolar 64= center, 1 unit is 2 cents TaskParamlabels(2) = "Note" TaskParamlabels(3) = "Flag" IF ISFALSE Task(%MC_Flag).hParam THEN slnr = %False MakeTaskParameterDialog %MC_Flag,2,Slider(),2,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%MC_Flag).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value Slider(slnr+1).value = 64 SendMessage Slider(Slnr+1).h, %TBM_SETPOS,%True, Slider(Slnr+1).value END IF IF ISFALSE udnr THEN UDctrl(TaskEX(%MC_Flag).UpdownNumbers(0)).cptr = CODEPTR(MC_Aeio_Note_UD) udnr = TaskEX(%MC_Flag).UpDownNumbers(0) UDctrl(udnr).minval = 36 UDctrl(udnr).maxval = 127 UDctrl(udnr).value = 36 UDctrl(TaskEX(%MC_Flag).UpdownNumbers(1)).cptr = CODEPTR(MC_Aeio_Flag_UD) UDctrl(udnr+1).minval =1 UDctrl(udnr+1).maxval = 64 UDctrl(udnr+1).value = 1 END IF i = %False f = %false t = %False Task(%MC_Flag).tog = %True END IF IF i <> Udctrl(udnr).value THEN ' note off niet nodig, done in UD callback. mPlay Aeio.channel, UDctrl(udnr).value, Slider(slnr).value Controller Aeio.channel, 100 + (i MOD 12), UDctrl(udnr+1).value 'keep flageolet number Controller Aeio.channel, 80 + (i MOD 12), Slider(slnr+1).value 'set fine tuning to slider value i = UDctrl(udnr).value velo = Slider(slnr).value ELSEIF velo <> slider(slnr).value THEN NoteOff Aeio.channel, UDctrl(udnr).value 'parser could try to play another string... mPlay Aeio.channel, UDctrl(udnr).value, Slider(slnr).value velo = slider(slnr).value END IF IF f <> UDctrl(udnr+1).value THEN Controller Aeio.channel, 100 + (i MOD 12), UDctrl(udnr+1).value 'flageolet number Aeio.ctrl(100 + (i MOD 12)) = UDctrl(udnr+1).value f = UDctrl(udnr+1).value END IF IF t <> Slider(slnr+1).value THEN Controller Aeio.channel, 80 + (i MOD 12), Slider(slnr+1).value 'fine tune Aeio.ctrl(80 + (i MOD 12)) = Slider(slnr+1).value t = Slider(slnr+1).value END IF task(%MC_Flag).freq = 20 END SUB FUNCTION MC_Aeio_Note_UD () AS LONG ' controls the string to be sounded STATIC noot AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Flag).UpDownNumbers(0) IF UDctrl(udnr).value < 36 THEN UDctrl(udnr).value = 36 IF UDctrl(udnr).value > 127 THEN UDctrl(udnr).value = 127 IF UDctrl(udnr).value <> noot THEN IF noot THEN mPlay Aeio.channel, noot, %False 'noteoff END IF noot = UDctrl(udnr).value END IF SetDlgItemText Task(%MC_Flag).hparam, %GMT_TEXT0_ID + 16, "N=" & STR$(noot) END FUNCTION FUNCTION MC_Aeio_Flag_UD () AS LONG ' controls the flageolet to be sounded LOCAL udnr AS DWORD udnr = TaskEX(%MC_Flag).UpDownNumbers(1) IF UDctrl(udnr).value < 1 THEN UDctrl(udnr).value = 1 IF UDctrl(udnr).value > 64 THEN UDctrl(udnr).value = 64 SetDlgItemText Task(%MC_Flag).hparam, %GMT_TEXT0_ID + 17, "F=" & STR$(UDctrl(udnr).value) END FUNCTION SUB aeio_controlroom () ' kl: fine tune ctrl. should be in center position on init!!!! LOCAL i AS LONG LOCAL x AS LONG, y AS LONG IF ISFALSE hwCtrlaeio THEN DIALOG NEW 0, "aeio Control",1,1 ,600, 90, %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU TO hwCtrlaeio x = 5 FOR i = aeio.lowtes TO aeio.HighTes SELECT CASE (i MOD 12) CASE 0 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "C", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 1 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "C#", x, y, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 2 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "D", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 3 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "D#", x, y, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 4 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "E", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 20 CASE 5 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "F", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 6 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "F#", x, y, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 7 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "G", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 8 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "G#", x, y, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 9 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "A", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 10 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "Bb", x, y, 18, 12, %BS_PUSHLIKE x = x + 10 CASE 11 CONTROL ADD CHECKBOX, hwCtrlaeio, i, "B", x, y + 12, 18, 12, %BS_PUSHLIKE x = x + 20 END SELECT IF x > 560 AND y < 30 THEN x = 5 y = y + 30 END IF NEXT CONTROL ADD LABEL, hwCtrlaeio, 500, "Fine Tuning (cc24)", 5, 65, 30, 12 CONTROL ADD "msctls_trackbar32", hwCtrlaeio, 501, _ "Tuning", 36, 65, 135, 12, %WS_CHILD OR %WS_VISIBLE OR _ %TBS_HORZ OR %TBS_BOTTOM CONTROL ADD LABEL, hwCtrlaeio, 503, "?", 174, 65, 30, 12 CONTROL ADD BUTTON, hwCtrlaeio, 600, "All Off", 206, 65, 30, 12 DIALOG SHOW MODELESS hwCtrlaeio CALL CB_aeio_Controlroom ELSE DIALOG END hwCtrlaeio hwCtrlaeio = 0 END IF END SUB CALLBACK FUNCTION CB_aeio_Controlroom LOCAL tuning AS BYTE LOCAL i AS LONG LOCAL note AS BYTE SELECT CASE CBMSG CASE %WM_COMMAND SELECT CASE CBCTL CASE aeio.Lowtes TO aeio.hightes 'checkboxes CONTROL GET CHECK CBHNDL, CBCTL TO i note = CBCTL IF i THEN mPlay aeio.channel, note, 64 ELSE mPlay aeio.channel, note, 0 END IF CASE 600 FOR i = aeio.lowtes TO aeio.hightes CONTROL SET CHECK CBHNDL, i, 0 DIALOG DOEVENTS NEXT Controller aeio.channel, 123, %False CONTROL HANDLE CBHNDL, 501 TO i SendMessage i, %TBM_SETPOS, %true, 0 CONTROL SET TEXT CBHNDL, 503, "0" END SELECT CASE %WM_HSCROLL, %WM_VSCROLL 'note: id doesn't correspond at all with the one given at creation IF (LOWRD(CBWPARAM) = %TB_THUMBPOSITION) OR (LOWRD(CBWPARAM) = %TB_THUMBTRACK) THEN tuning = HIWRD(CBWPARAM) ELSE tuning = SendMessage (CBLPARAM, %TBM_GETPOS,%Null, %Null) END IF IF tuning <> Aeio.ctrl(24) THEN CONTROL SET TEXT CBHNDL, 503, STR$(tuning) Controller Aeio.channel, 24, tuning Aeio.ctrl(24) = tuning END IF 'TO BE IMPLEMENTED CASE %WM_CLOSE, %WM_QUIT hwCtrlaeio = 0 FOR i = aeio.lowtes TO aeio.hightes DIALOG DOEVENTS NEXT Controller aeio.channel, 123, %False END SELECT END FUNCTION SUB Lite1 () ' this is the blue light on the parser board STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite1).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite1).hParam THEN slnr = %False MakeTaskParameterDialog %Lite1,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite1).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite1).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 1, slider(slnr).value ELSE NoteOff Aeio.channel, 1 END IF INCR cnt END SUB SUB Lite2 () ' rode LED strip STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite2).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite2).hParam THEN slnr = %False MakeTaskParameterDialog %Lite2,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite2).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite2).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 2, Slider(slnr).value ELSE NoteOff Aeio.channel, 2 END IF INCR cnt END SUB SUB Lite3 () STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite3).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite3).hParam THEN slnr = %False MakeTaskParameterDialog %Lite3,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite3).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite3).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 3, slider(slnr).value ELSE NoteOff Aeio.channel, 3 END IF INCR cnt END SUB SUB Lite4 () STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite4).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite4).hParam THEN slnr = %False MakeTaskParameterDialog %Lite4,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite4).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite4).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 4, slider(slnr).value ELSE NoteOff Aeio.channel, 4 END IF INCR cnt END SUB SUB Lite5 () STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite5).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite5).hParam THEN slnr = %False MakeTaskParameterDialog %Lite5,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite5).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite5).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 5, slider(slnr).value ELSE NoteOff Aeio.channel, 5 END IF INCR cnt END SUB SUB Lite6 () STATIC cnt AS WORD STATIC slnr AS DWORD IF ISFALSE Task(%Lite6).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Speed" IF ISFALSE Task(%Lite6).hParam THEN slnr = %False MakeTaskParameterDialog %Lite6,1,Slider(),0,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Lite6).SliderNumbers(0) Slider(slnr).value = 64 SendMessage Slider(Slnr).h, %TBM_SETPOS,%True, Slider(Slnr).value END IF Task(%Lite6).tog = %True END IF IF ISFALSE cnt MOD 2 THEN mPlay Aeio.channel, 6, slider(slnr).value ELSE NoteOff Aeio.channel, 6 END IF INCR cnt END SUB SUB MC_ProgChange () STATIC udnr AS LONG IF ISFALSE Task(%MC_progchange).tog THEN DIM TaskParamLabels(0) AS ASCIIZ * 8 TaskParamLabels(0) = "Prg" IF ISFALSE Task(%MC_progchange).hParam THEN MakeTaskParameterDialog %MC_progchange,0,Slider(),1,UDctrl(),TaskParamLabels() END IF IF ISFALSE udnr THEN udnr = TaskEX(%MC_progchange).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(MC_ProgChange_UD) Udctrl(udnr).minval = 0 UDctrl(udnr).maxval = 32 UDctrl(udnr).value = 2 ' default setting on cold boot END IF SetDlgItemText Task(%MC_Progchange).hparam, %GMT_TEXT0_ID + 16, "P=" & STR$(UDctrl(udnr).value) Task(%MC_progchange).tog = %True END IF Task(%MC_progchange).freq = 1 END SUB FUNCTION MC_Progchange_UD () AS LONG ' U/D callback ' controls the FREQUENCY LOOKUP TO USE STATIC n AS BYTE LOCAL udnr AS DWORD udnr = TaskEX(%MC_Progchange).UpDownNumbers(0) IF UDctrl(udnr).value <> n THEN Progchange Aeio.channel, n n = UDctrl(udnr).value END IF SetDlgItemText Task(%MC_Progchange).hparam, %GMT_TEXT0_ID + 16, "P=" & STR$(n) END FUNCTION SUB Torture () 'sends arbitrary midi bytes, not on Aeio's channel... 'midi must crash on this. LOCAL i AS INTEGER FOR i = 0 TO 3 '4 x 8 x 100 bytes a second = 3200 bytes/s '8 bytes per loop mPlay 2 + (i MOD 12), i, RND(1) * 127 '3 bytes Release 2 + (i MOD 12), i, RND(1) * 127 '3 bytes ProgChange 2 + (i MOD 6), RND(1) * 127 '2 bytes NEXT i END SUB ' ----- demo stukje voor Aeio SUB UforAeio () 'piece by xof for Aeio 'reset Aeio before starting.. 'task runs 40 times/s STATIC cc AS DWORD STATIC ccc AS DWORD LOCAL chk AS BYTE LOCAL i AS LONG STATIC o1 AS BYTE, o2 AS BYTE, o3 AS BYTE, o4 AS BYTE, o5 AS BYTE, o6 AS BYTE IF ISFALSE cc THEN Warning "reset Aeio before starting this piece Controller Aeio.channel, 7, 60 controller Aeio.channel, 64, 64 o1 = 1 o2 = 1 o3 = 1 o4 = 1 o5 = 1 o6 = 1 ' ccc = 6 'temp for debug END IF CONTROL SET TEXT gh.cockpit, %GMT_MSG1, STR$(ccc) + STR$(cc) SELECT CASE ccc CASE 0 IF ISFALSE(cc MOD 64) THEN mPlay Aeio.channel, 44, 0 'was 36 maar eie klinkt te lelijk van zodra het luid gaat.. mPlay Aeio.channel, 44, MIN(60, cc/18) Controller Aeio.channel, 100 + (44 MOD 12), 1 'flageolet number Controller Aeio.channel, 80 + (44 MOD 12), 64 'set fine tuning to slider value END IF IF (cc > 400) AND ISFALSE ((cc + 2) MOD 40) THEN IF(MIN(100, (cc-250)/12) < 100) THEN mPlay Aeio.channel, 38, 0 mPlay Aeio.channel, 38, MIN(100, (cc-400)/10) Controller Aeio.channel, 100 + (38 MOD 12), 1 'flageolet number Controller Aeio.channel, 80 + (38 MOD 12), 64 'set fine tuning to slider value ELSE 'just let it sound END IF END IF IF (cc > 600) AND ISFALSE (cc MOD 48) THEN IF(MIN(100, (cc-300)/12) < 100) THEN mPlay Aeio.channel, 40, 0 mPlay Aeio.channel, 40, MIN(100, (cc-600)/8) Controller Aeio.channel, 100 + (40 MOD 12), 1 'flageolet number Controller Aeio.channel, 80 + (40 MOD 12), 64 'set fine tuning to slider value END IF END IF IF (cc > 800) AND ISFALSE (cc MOD 56) THEN IF(MIN(100, (cc-750)/12) < 100) THEN mPlay Aeio.channel, 41, 0 mPlay Aeio.channel, 41, MIN(100, (cc-800)/6) Controller Aeio.channel, 100 + (41 MOD 12), 1 'flageolet number Controller Aeio.channel, 80 + (41 MOD 12), 64 'set fine tuning to slider value END IF END IF IF (cc > 1000) AND ISFALSE (cc MOD 72) THEN IF(MIN(100, (cc-600)/12) < 100) THEN mPlay Aeio.channel, 43, 0 mPlay Aeio.channel, 43, MIN(100, (cc-1000)/4) Controller Aeio.channel, 100 + (43 MOD 12), 1 'flageolet number Controller Aeio.channel, 80 + (43 MOD 12), 64 'set fine tuning to slider value END IF END IF IF cc >= 1800 THEN mPlay Aeio.channel, 24, 32 'hamers cc = 1 ccc = 1 END IF CASE 1 SELECT CASE cc CASE 1 CASE 3: mPlay Aeio.channel, 26, 32 CASE 6: mPlay Aeio.channel, 27, 32 CASE 9: mPlay Aeio.channel, 29, 32 CASE 12: mPlay Aeio.channel, 28, 32 CASE 15: mPlay Aeio.channel, 30, 32 CASE 18: mPlay Aeio.channel, 31, 32 CASE 21: mPlay Aeio.channel, 33, 32 CASE 24: mPlay Aeio.channel, 32, 32 CASE 27: mPlay Aeio.channel, 34, 32 CASE 30: mPlay Aeio.channel, 35, 50 CASE 36: mPlay Aeio.channel, 36, 80 END SELECT IF cc = 540 THEN controller Aeio.channel, 123, 1 mPlay Aeio.channel, 24, 64 'hamers mPlay Aeio.channel, 26, 64 mPlay Aeio.channel, 28, 64 mPlay Aeio.channel, 29, 64 mPlay Aeio.channel, 30, 64 END IF IF cc > 700 THEN cc = 1 ccc = 2 mPlay Aeio.channel, 36, 100 mPlay Aeio.channel, 38, 100 mPlay Aeio.channel, 40, 100 mPlay Aeio.channel, 41, 100 mPlay Aeio.channel, 43, 100 mPlay Aeio.channel, 44, 100 o1 = 16: o2 = 16: o3 = 16: o4 = 16: o5=16: o6 = 16 END IF CASE 2 SELECT CASE cc MOD 18 CASE 0: controller Aeio.channel, 80, 29 + (cc MOD 600)/12 : Controller Aeio.channel, 100, o1 CASE 3: controller Aeio.channel, 82, 89 - (cc MOD 660)/13.20: Controller Aeio.channel, 102, o2 CASE 6:: controller Aeio.channel, 84, 29 + (cc MOD 720)/14.80: Controller Aeio.channel, 104, o3 CASE 9: controller Aeio.channel, 85, 89 - (cc MOD 780)/15.60: Controller Aeio.channel, 105, o4 CASE 12: controller Aeio.channel, 87, 29 + (cc MOD 840)/16.80: Controller Aeio.channel, 107, o5 CASE 15: controller Aeio.channel, 88, 29 + (cc MOD 880)/16.80: Controller Aeio.channel, 108, o5 END SELECT IF cc > 1680 THEN ccc = 3 cc = 1 END IF CASE 3 chk = 15- 13 * cc/6600 IF chk <> 01 THEN o1 = chk Controller Aeio.channel, 100, o1 END IF chk = 15- 13 * (cc/6600) ^ 1.5 IF chk <> 02 THEN o2 = chk Controller Aeio.channel, 102, o2 END IF chk = 15- 13 * (cc/6600) ^ .75 IF chk <> 03 THEN o3 = chk Controller Aeio.channel, 104, o3 END IF chk = 15- 13 * (cc/6600) ^ 2.6 IF chk <> 04 THEN o4 = chk Controller Aeio.channel, 105, o4 END IF chk = 15- 13 * (cc/6600) ^ .5 IF chk <> 05 THEN o5 = chk Controller Aeio.channel, 107, o5 END IF chk = 15- 13 * (cc/6600) ^ 2 IF chk <> 06 THEN o6 = chk Controller Aeio.channel, 108, o6 END IF SELECT CASE cc MOD 18 CASE 0: controller Aeio.channel, 80, 14 + (cc MOD 600)/6 : Controller Aeio.channel, 100, o1 CASE 3: controller Aeio.channel, 82, 114 - (cc MOD 660)/6.60: Controller Aeio.channel, 102, o2 CASE 6:: controller Aeio.channel, 84, 14 + (cc MOD 720)/7.20: Controller Aeio.channel, 104, o3 CASE 9: controller Aeio.channel, 85, 114 - (cc MOD 780)/7.80: Controller Aeio.channel, 105, o4 CASE 12: controller Aeio.channel, 87, 14 + (cc MOD 840)/8.40: Controller Aeio.channel, 107, o5 CASE 15: controller Aeio.channel, 88, 29 + (cc MOD 880)/16.80: Controller Aeio.channel, 108, o5 END SELECT CONTROL SET TEXT gh.cockpit, %GMT_MSG2, STR$(o1) + STR$(o2) + STR$(o3) + STR$(o4) + STR$(o5) + STR$(14 + (cc MOD 600)/6) IF cc >= 7000 THEN ccc = 4 cc = 1 END IF CASE 4 SELECT CASE cc MOD 18 CASE 0: controller Aeio.channel, 80, 14 + (cc MOD 600)/6 : Controller Aeio.channel, 100, o1 CASE 3: controller Aeio.channel, 82, 114 - (cc MOD 660)/6.60: Controller Aeio.channel, 102, o2 CASE 6:: controller Aeio.channel, 84, 14 + (cc MOD 720)/7.20: Controller Aeio.channel, 104, o3 CASE 9: controller Aeio.channel, 85, 114 - (cc MOD 780)/7.80: Controller Aeio.channel, 105, o4 CASE 12: controller Aeio.channel, 87, 14 + (cc MOD 840)/8.40: Controller Aeio.channel, 107, o5 CASE 15: controller Aeio.channel, 88, 29 + (cc MOD 880)/16.80: Controller Aeio.channel, 108, o5 END SELECT IF cc >= 1600 THEN ccc = 5 cc = 1 END IF CASE 5 ' Warning "ënd manually once the beaters slowed down enough" SELECT CASE cc MOD 24 CASE 0: controller Aeio.channel, 80, 14 + (cc MOD 600)/6 : Controller Aeio.channel, 100, o1 CASE 4: controller Aeio.channel, 82, 114 - (cc MOD 660)/6.60: Controller Aeio.channel, 102, o2 CASE 8:: controller Aeio.channel, 84, 14 + (cc MOD 720)/7.20: Controller Aeio.channel, 104, o3 CASE 12: controller Aeio.channel, 85, 114 - (cc MOD 780)/7.80: Controller Aeio.channel, 105, o4 CASE 16: controller Aeio.channel, 87, 14 + (cc MOD 840)/8.40: Controller Aeio.channel, 107, o5 CASE 20: controller Aeio.channel, 88, 29 + (cc MOD 880)/16.80: Controller Aeio.channel, 108, o5 END SELECT FOR i = 0 TO 11 IF ISFALSE((cc ) MOD (INT(i + cc/20) + 2 )) THEN mPlay Aeio.channel, 24 + i, MIN(120, 5 + cc/40) END IF NEXT IF cc >= 2800 THEN ccc = 6 cc = 1 END IF CASE 6 SELECT CASE cc CASE 1 CASE 13: mPlay Aeio.channel, 26, 32 CASE 26: mPlay Aeio.channel, 27, 42 CASE 38: mPlay Aeio.channel, 28, 52 CASE 49: mPlay Aeio.channel, 29, 62 CASE 39: mPlay Aeio.channel, 30, 72 CASE 28: mPlay Aeio.channel, 31, 82 CASE 36: mPlay Aeio.channel, 32, 92 CASE 43,64: mPlay Aeio.channel, 33, 100 CASE 49, 74: mPlay Aeio.channel, 34, 100 CASE 54, 61: mPlay Aeio.channel, 35, 100 CASE 58: mPlay Aeio.channel, 36, 127 CASE 61: mPlay Aeio.channel, 35, 127 CASE 64: mPlay Aeio.channel, 33, 127 CASE 67:mPlay Aeio.channel, 31, 127 CASE >= 110: stoptask %uforaeio END SELECT END SELECT INCR cc END SUB SUB Radar () ' steers data acquisition parameters for the radar interface on Aeio ' midi in on the radar board must be connected to a midi source. ' 01.11.2017 - gwr. ' 05.11.2017 - updated with new default settings in the firmware STATIC udnr, slnr AS LONG IF ISFALSE Task(%Aeio_Radar).tog THEN DIM TaskParamLabels(5) AS ASCIIZ * 8 TaskParamLabels(0) = "#74" ' noise floor - slider TaskParamLabels(1) = "#70" ' dt for accelleration TaskParamLabels(2) = "#71" ' dt for surface differential dS TaskParamLabels(3) = "#73" ' sens. for aeio-rising TaskParamLabels(4) = "#78" ' accel multiplier TaskParamLabels(5) = "#77" ' dS multiplier IF ISFALSE Task(%Aeio_Radar).hParam THEN MakeTaskParameterDialog %Aeio_Radar,3,Slider(),3,UDctrl(),TaskParamLabels() END IF IF ISFALSE slnr THEN slnr = TaskEX(%Aeio_Radar).slidernumbers(0) Aeio.ctrl(74) = 1 ' noise floor default in firmware Aeio.ctrl(70) = 23 ' makes 48 in the firmware Aeio.ctrl(71) = 81 ' makes 164 in the firmware slider(slnr).value = Aeio.ctrl(74) slider(slnr+1).value = Aeio.ctrl(70) slider(slnr+2).value = Aeio.ctrl(71) 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 END IF IF ISFALSE udnr THEN udnr = TaskEX(%Aeio_Radar).UpDownNumbers(0) UDctrl(udnr).cptr = CODEPTR(Aeio_Radar_UD73) Udctrl(udnr).minval = 0 UDctrl(udnr).maxval = 127 Aeio.ctrl(73) = 12 UDctrl(udnr).value = Aeio.ctrl(73) UDctrl(udnr+1).cptr = CODEPTR(Aeio_Radar_UD78) Udctrl(udnr+1).minval = 0 UDctrl(udnr+1).maxval = 127 Aeio.ctrl(78) = 16 UDctrl(udnr+1).value = Aeio.ctrl(78) ' multiplier for Accel UDctrl(udnr+2).cptr = CODEPTR(Aeio_Radar_UD77) Udctrl(udnr+2).minval = 0 UDctrl(udnr+2).maxval = 8 Aeio.ctrl(77) = 1 UDctrl(udnr+2).value = Aeio.ctrl(77) ' multiplier for dS END IF SetDlgItemText Task(%Aeio_Radar).hparam, %GMT_TEXT0_ID + 16, "#73=" & STR$(Aeio.ctrl(73)) SetDlgItemText Task(%Aeio_Radar).hparam, %GMT_TEXT0_ID + 17, "#78=" & STR$(Aeio.ctrl(78)) Task(%Aeio_Radar).tog = %True END IF ' updates sent only once a second! IF slider(slnr).value <> Aeio.ctrl(74) THEN Aeio.ctrl(74) = slider(slnr).value Controller Aeio.channel, 74, Aeio.ctrl(74) END IF IF slider(slnr+1).value <> Aeio.ctrl(70) THEN Aeio.ctrl(70) = slider(slnr+1).value Controller Aeio.channel, 70, Aeio.ctrl(70) END IF IF slider(slnr+2).value <> Aeio.ctrl(71) THEN Aeio.ctrl(71) = slider(slnr+2).value Controller Aeio.channel, 71, Aeio.ctrl(71) END IF END SUB SUB Aeio_Radar_UD73 () ' cc73 LOCAL udnr AS LONG udnr = TaskEX(%Aeio_Radar).UpDownNumbers(0) IF UDctrl(udnr).value <> Aeio.ctrl(73) THEN Controller Aeio.channel, 73, UDctrl(udnr).value Aeio.ctrl(73) = UDctrl(udnr).value END IF SetDlgItemText Task(%Aeio_Radar).hparam, %GMT_TEXT0_ID + 16, "#73=" & STR$(Aeio.ctrl(73)) END SUB SUB Aeio_Radar_UD78 () ' cc78 multiplier for accel LOCAL udnr AS LONG udnr = TaskEX(%Aeio_Radar).UpDownNumbers(1) IF UDctrl(udnr).value <> Aeio.ctrl(78) THEN Controller Aeio.channel, 78, UDctrl(udnr).value Aeio.ctrl(78) = UDctrl(udnr).value END IF SetDlgItemText Task(%Aeio_Radar).hparam, %GMT_TEXT0_ID + 17, "#78=" & STR$(Aeio.ctrl(78)) END SUB SUB Aeio_Radar_UD77 () ' cc77 multiplier for dS LOCAL udnr AS LONG udnr = TaskEX(%Aeio_Radar).UpDownNumbers(2) IF UDctrl(udnr).value <> Aeio.ctrl(77) THEN Controller Aeio.channel, 77, UDctrl(udnr).value Aeio.ctrl(77) = UDctrl(udnr).value END IF SetDlgItemText Task(%Aeio_Radar).hparam, %GMT_TEXT0_ID + 18, "#77=" & STR$(Aeio.ctrl(77)) END SUB