'"Geroll & Bijzonder Blauw" - Jelle Meander 'coding: kristof lauwers 'springers (shakers en zwaailicht), belly, PD patch over UDP '030103 problem with siren: starts playing when not asked > added siren note offs... GLOBAL GR_Belly AS musician GLOBAL GR_Springs AS musician GLOBAL GR_UdpOut AS LONG GLOBAL bellystat AS WORD GLOBAL destip AS LONG DECLARE FUNCTION GR_Init AS LONG DECLARE FUNCTION GR_Main AS LONG 'task DECLARE FUNCTION GR_Bellytask AS LONG %grmain = 32 'tasknr %grbelly = 33 %pdport = 3000 'port for udp-ing to PD %shakemaxfreq = 20 %shakeritmefreq = 5 'ritme voor sekties 5, 6, 9 %shakeloud = 54 'velo voor shakers %shakequiet = 24 $pd_path = "c:\pd\bin\pd.exe c:\b\pb\gmt\kristof\geroll\playwaves.pd" FUNCTION GR_Init AS LONG LOCAL i AS LONG LOCAL hostname$ LOCAL ip AS LONG LOCAL portnum AS LONG portnum = %pdport HOST ADDR TO ip HOST NAME TO hostname$ destip = ip OR &HFF000000 GetInstrumentParams GR_Belly, %ID_BELLY GetInstrumentParams GR_Springs, %ID_SPRINGERS SetRobotPort GR_Belly, "", hMidiO() SetRobotPort GR_Springs, "", hMidiO() task(%grmain).naam = "geroll" task(%grmain).freq = %ShakeMaxFreq '20 task(%grmain).cptr = CODEPTR(GR_Main) task(%grbelly).naam = "gr_bel" task(%grbelly).freq = 4 task(%grbelly).cptr = CODEPTR(GR_BellyTask) Modemess GR_Belly.channel, &H44, 0 'belly listen!! not matchtask.. i = SHELL($pd_path) SLEEP 1000 MSGBOX "please wait until PD has started up and then click ok",,FUNCNAME$ g_net_init App g_net_send "2" + CHR$(10), 0 ' local f as long ' local buf$ ' f = FREEFILE ' UDP OPEN AS f ' buf$ = "500" + CHR$(10) ' UDP SEND f, AT destip, portnum, buf$ ' UDP CLOSE f 'TO DO: init instruments. belly to dir4ekt listen END FUNCTION FUNCTION GR_Main AS LONG'task STATIC nexttime AS DOUBLE STATIC sectioncount AS LONG STATIC timings() AS LONG 'duur van sekties in seconden STATIC springersstat AS WORD ': 00000xxx 000000yy xxx bits voor 100 = laag, 010 = midden, 001 = hoog | yyy bits voor 001 = licht, 010 = dens, 100 = homoritimisch, 011 = minder dens STATIC lastbellytime AS LONG ' n.v.t zo snel ritme ad lib STATIC lastspringerstime AS LONG STATIC this AS LONG STATIC shaker AS BYTE STATIC lightvelo AS BYTE STATIC shkritme AS DWORD STATIC shkritmecount AS DWORD ' g_net_send "3333" + CHR$(10), 0 'STR$(1000 + (RND * 100)), 0 IF ISFALSE nexttime THEN 'init this = %grmain shkritme = &B010111011101011111 ' &B111110101110111010 'voor shkaers sekties 5,6,9 van achter naar voor te lezen!! 'mogelijk + zwaai DIM timings(16) '0 = dummy timings(1) = 11 timings(2) = 13 timings(3) = 17 timings(4) = 19 timings(5) = 23 timings(6) = 23 timings(7) = 11 timings(8) = 13 timings(9) = 17 timings(10) = 11 timings(11) = 13 timings(12) = 17 timings(13) = 13 timings(14) = 11 timings(15) = 11 timings(16) = 11 sectioncount = 1 bellystat = 0 springersstat = 0 CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 10, STR$(sectioncount) nexttime = TIMER + timings(sectioncount) shaker = 124 StartTask %GRBelly END IF IF nexttime <= TIMER THEN INCR sectioncount CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 10, "sektie:" + FORMAT$(sectioncount, "00") Play GR_Springs.channel, 2, 0 'light off SELECT CASE sectioncount CASE 2 springersstat = &B01 task(this).freq = %shakemaxfreq g_net_send "100" + CHR$(10), 0 CASE 3 bellystat = &B0000000100000001: springersstat = 0 task(this).freq = %shakeritmefreq g_net_send "4" + CHR$(10), 0 CASE 4 bellystat = 0 g_net_send "100" + CHR$(10), 0 CASE 5 task(this).freq = %shakeritmefreq: springersstat = &B010 g_net_send "6" + CHR$(10), 0 CASE 6 bellystat = &B0000011100000010 'shakers blijven g_net_send "100" + CHR$(10), 0 CASE 7: bellystat = &B0000011100000001: springersstat = 0 CASE 8: bellystat = 0 CASE 9 g_net_send "10" + CHR$(10), 0 springersstat = &B010: task(this).freq = %shakeritmefreq CASE 10 springersstat = 0 g_net_send "100" + CHR$(10), 0 CASE 11 bellystat = &B0000011000000001 g_net_send "11" + CHR$(10), 0 SLEEP 1 g_net_send "100" + CHR$(10), 0 CASE 12: bellystat = &B0000001000000011: springersstat = &B0100 CASE 13 bellystat = &B0000001100000010 'shakers blijven g_net_send "14" + CHR$(10), 0 CASE 14 bellystat = 0 'shakers blijven g_net_send "100" + CHR$(10), 0 CASE 15 Play GR_Springs.channel, 1, 0 bellystat = &B0000010000000010: springersstat = 0 g_net_send "15" + CHR$(10), 0 SLEEP 1 g_net_send "100" + CHR$(10), 0 CASE 16 bellystat = &B0000101000000100: springersstat = &B01: task(this).freq = %shakemaxfreq g_net_send "16" + CHR$(10), 0 SLEEP 1 g_net_send "100" + CHR$(10), 0 CASE 17 stoptask %grmain Stoptask %grbelly Play GR_Springs.channel, 2, 0 Play GR_Springs.channel, 1, 0 Play GR_Springs.channel, 2, 0 g_net_send "1000" + CHR$(10), 0 END SELECT nexttime = nexttime + timings(sectioncount) END IF SELECT CASE springersstat CASE &B01 '"zo snel mogelijk, + zwaailicht" ' task(this).freq = %shakemaxfreq EVT hier randomizen?? zenuwachtige indruk vs gewoon zo snel mogelijk shaken IF BIT(shaker, 0) THEN Play Gr_Springs.channel, shaker, %shakeloud 'velo moet genoeg zijn om recht te blijven staan, maar ook n veel meer (max tempo...) !!!!!!! ELSE Play GR_SPrings.channel, shaker, %shakequiet END IF lightvelo = (5 * lightvelo + 84 + 43 * RND) / 6 lightvelo = lightvelo AND &HFE Play GR_Springs.channel, 2, lightvelo 'zwaailicht Play GR_Springs.channel, 1, 0 INCR shaker: IF shaker > 127 THEN shaker = 124 CASE &B010 ' "Rietme" IF BIT(shkritme, shkritmecount) THEN IF ISFALSE BIT(shkritme, shkritmecount + 1) THEN Play GR_Springs.channel, 127, %shakeloud 'kwarten , op luidste shaker Play GR_Springs.channel, 124, %shakequiet 'kwarten , op luidste shaker ELSE 'evt l/r shaker gebruiken voor kwart resp achtste..? Play GR_Springs.channel, 125, %shakeloud 'achtsten END IF Play GR_Springs.channel, 1, 0 END IF INCR shkritmecount: IF shkritmecount > 17 THEN shkritmecount = 0 CASE &B0100 'ad lib, abrupt/verstoord, idem zwaailicht IF RND > .7 THEN task(this).freq = 0.4 + 8 * RND ^ 2 'check random fct.. ELSE task(this).freq = MAX(0.5, task(this).freq - RND) END IF shaker = 124 + RND * 3 ' bit set shaker, 0 Play GR_Springs.channel, shaker, %shakeloud + 10 Play GR_Springs.channel, 2, RND * 127 Play GR_Springs.channel, 1, 0 CASE 0 'do nothing CASE ELSE 'we have a bug MSGBOX "unknown CASE springersstat " + BIN$(springersstat),, FUNCNAME$ + " heeft beestjes" END SELECT END FUNCTION FUNCTION GR_Bellytask AS LONG STATIC this AS LONG LOCAL density AS BYTE LOCAL tess AS BYTE LOCAL bel AS BYTE LOCAL frq AS SINGLE IF ISFALSE this THEN this = %grbelly END IF IF ISFALSE bellystat THEN EXIT FUNCTION density = LOBYT(bellystat) tess = HIBYT(bellystat) SELECT CASE density CASE &B001 'licht '1 bel tegelijk, min velocity!! SELECT CASE tess CASE &B001: bel = 92 + RND * 11 'alleen hoog ' 3 CASE &B0111: bel = 68 + RND ^ 2 * 35 'alle ' 7 CASE &B0110: bel = 68 + RND ^ 2 * 24 'laag-mid, 11 END SELECT Play GR_Belly.channel, bel, 1 frq = .3 + 2 * RND ^ 3 CASE &B010 'dens '1, soms 2, heel af en toe 3 bellen, vluggere tempo's SELECT CASE tess CASE &B0111 'laag mid hoog, 6 bel = 68 + RND * 35: Play GR_Belly.channel, bel, 1 frq = .5 + 8 * RND IF RND > .63 THEN bel = 80 + RND * 23: Play GR_Belly.channel, bel, 1 frq = .5 + 5 * RND ^ 2 IF RND > .6 THEN bel = 92 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .5 + 2 * RND ^ 2 END IF END IF CASE &B0011 'mid & hoog, 13 bel = 80 + RND * 23: Play GR_Belly.channel, bel, 1 frq = .7 + 8 * RND IF RND > .63 THEN bel = 80 + RND * 23: Play GR_Belly.channel, bel, 1 frq = .7 + 5 * RND ^ 2 IF RND > .6 THEN bel = 92 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .7 + 2 * RND ^ 2 END IF END IF CASE &B0100 'alleen laag, 15 bel = 68 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .5 + 4 * RND IF RND > .6 THEN bel = 68 + SQR(RND) * 12: Play GR_Belly.channel, bel, 1 frq = .5 + 3 * RND ^ 2 IF RND > .6 THEN bel = 68 + SQR(RND) * 12: Play GR_Belly.channel, bel, 1 frq = .5 + 2 * RND ^ 2 END IF END IF CASE ELSE MSGBOX "invalid tess " + BIN$(tess),, FUNCNAME$ END SELECT CASE &B011 'minder licht 12 'alleen mid freq bel = 80 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .3 + 4 * RND IF RND > .7 THEN bel = 80 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .3 + 3 * RND END IF CASE &B0100 'homoritmisch dens bel = 68 + RND * 12: Play GR_Belly.channel, bel, 1 bel = 90 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .7 + 4 * RND IF RND > .3 THEN bel = 90 + RND * 12: Play GR_Belly.channel, bel, 1 frq = .7 + 3 * RND^3 IF RND > .3 THEN frq = .7 + 2 * SQR(RND) bel = 68 + SQR(RND) * 12: Play GR_Belly.channel, bel, 1 END IF END IF CASE ELSE MSGBOX "invalid density " + BIN$(density),, FUNCNAME$ END SELECT task(this).freq = INT(frq * 5) / 5 'quantize op vijfden van sec CONTROL SET TEXT gh.cockpit, %GMT_TEXT0_ID + 12, FORMAT$(task(this).freq, "00.00") END FUNCTION