'**************************************************************************** '* * '* GMT-SERVER APPLICATION FOR * '* * '* written by Godfried-Willem Raes and Kristof Lauwers * '* september-october 2000 * '**************************************************************************** ' This program receives midi information from intranets and internet and ' sends out mididata to connected automated instrument servers, running ' their own specific GMT software. ' It is designed to run under Windows 2000 / NT ' 12.09.2000: first sketch. ' 15.09.2000: work by KL ' 15-16.09.2000: dll midi-in extended with required functionality for wsb. ' 16.09.2000: coding session by gwr. standard protocol redefined! ' 17.09.2000: complete midi implementation table: cfr. http://www.ping.be/logos/tromp/wsb_midi_implementation.html ' 18.09.2000: joint efforts KL & GWR ' 19.09.2000: simple idea for a TUTTI piece... ' 20.09.2000: work by KL - monitor window added ' 22.09.2000: first try running server on NT machine ' ! we need the file ...\gmt\tromp\wsb_server.dat , or gmt hangs!! ' 26.09.2000: server works ' 03.10.2000: whispermode implemented in server, not in other modules yet... ' 12.10.2000: gwr . new piece SpringShake added (should be third piece for springers) ' we now have <4 Springs> , , ' 16.10.2000: tomorrow try out concert... ' 22.01.2001: start implementation of ftp support, so we can use our own domain server! ' 05.07.2001: ftp file I/O works. now we need to parse the files... ' 09.03.2005: adapt to PBWIN 8.0 #INCLUDE "g_ftp.bi" TYPE WSB_VOTES BYTE Klung(0 TO 31) AS WORD ' votes for compositions: 20 to 30 , 31= indiv. playing. ThunderWood(0 TO 31) AS WORD ' votes for the instrument is in index 0 Troms(0 TO 31) AS WORD ' the selected piece ID is in index 1 Springers(0 TO 31) AS WORD ' in index 2, we keep a flag for the individual note playing tasks. END TYPE GLOBAL Votes AS WSB_VOTES 'GLOBAL WhisperMode AS LONG 'moved tog gmt_glob.bi 'GLOBAL pVotes AS WSB_VOTES PTR ' This type is in the code used as follows: ' Indexes 20 to 31 contain the votes for the corresponding compositions ' 31 is the votes for individual playing of the instrument ' Index 0 contains the votes for the instrument in general ' Index 1 contains the ID for the selected piece ' Index 2 contains a flag for 0= indiv. playing task not running ' 1= indiv. playing task is running ' We need this flag, because this indiv. playing taskcode ' is part of the WSB server code. ' Index 3 contains the latest setting for controller 3 ' Index 7 contains the latest setting for controller 7 ' Index 9 contains the latest setting for controller 9 ' Index 14 contains the latest setting for controller 14 ' Index 15 contains the latest setting for controller 15 (not used yet) ' Index 4 flag for Wsb_Tutti 0 = task running ' 1 = task stopped DECLARE FUNCTION Wsb_InitServer () AS LONG DECLARE SUB Wsb_Listen () ' task 16 DECLARE SUB Ftp_Listen () ' task 17 - to be done!!! DECLARE FUNCTION FTP_getFiles(BYVAL dummy AS DWORD) AS LONG ' thread called by ftp_listen DECLARE FUNCTION FTP_InputHandler AS LONG DECLARE SUB Wsb_Klung_Notes () ' task 32 DECLARE SUB Wsb_ThunderWood_Notes () ' 33 DECLARE SUB Wsb_Troms_Notes () ' 34 DECLARE SUB Wsb_Springers_Notes () ' 35 DECLARE SUB Klung_Piece_Selector '48 takes care of selecting pieces for klung DECLARE SUB ThunderWood_Piece_Selector '49 DECLARE SUB Troms_Piece_Selector '50 DECLARE SUB Springers_Piece_Selector '51 DECLARE SUB Wsb_StatusWindow '52 show params in a window DECLARE FUNCTION ReturnHandlerDlg AS LONG 'returns handler of statuswindow, creates statuswindow on first call DECLARE SUB Wsb_Slider_Tempo () ' slider0 callback. DECLARE SUB Wsb_slider_Responsiveness () ' slider1 callback DECLARE SUB ToggleWhisperMode 'toggles whisper mode on/off DECLARE SUB Stoch_Server 'for simu playing of the stoch pieces from server DECLARE FUNCTION Stoch_window AS LONG 'slave of stoch_server DECLARE CALLBACK FUNCTION cbStoch 'the handlers are called from the listen proc to pass values to instrument servers 'they can also be used to check and return the current value of a parameter DECLARE FUNCTION KlungHandler (BYVAL msg AS WORD) AS BYTE DECLARE FUNCTION ThunderWoodHandler (BYVAL msg AS WORD) AS BYTE DECLARE FUNCTION TromsHandler (BYVAL msg AS WORD) AS BYTE DECLARE FUNCTION SpringersHandler (BYVAL msg AS WORD) AS BYTE DECLARE SUB Wsb_Tutti_Task () ' piece for all 18.09.2000 'the%WSB_ ... constants have been moved to gmt_kons.bi '%WSB_CHANGE_VELO = &H100 '000 ' binary 0000 0001 0000 0000 ' hibyt = 1 ' was KL bug!!! '%WSB_CHANGE_SPEED = &H200 '000 ' binary 0000 0010 0000 0000 ' hibyt = 2 '%WSB_CHANGE_DENSITY = &H300' 000 ' binary 0000 0011 0000 0000 ' hibyt = 3 '%WSB_CTRL_VELO = 3 ' midi controller numbers valid for all pieces/instruments '%WSB_CTRL_SPEED = 9 '%WSB_CTRL_DENS = 14 '%WSB_CTRL = 15 '%WSB_CTRL_KLUNGELS = 20 ' aantal kiezers voor Klungels - midi controller nr. '%WSB_CTRL_STOCHLUNG = 21 '%WSB_CTRL_THOMAS = 22 '%WSB_CTRL_TANGO = 23 '%WSB_CTRL_GRAYS = 24 '$WSB_CTRL_TUTTI = 30 '%WSB_CTRL_KLUNG_INDIV = 31 ' '%WSB_CTRL_WOODY = 20 ' thunderwood '%WSB_CTRL_WOODSTOCH = 21 '%WSB_CTRL_THUND_INDIV = 31 ' '%WSB_CTRL_ETROMS = 20 ' troms '%WSB_CTRL_STOCHTROM = 21 '%WSB_CTRL_AFROTROM = 22 '%WSB_CTRL_TROMS_INDIV = 31 ' '%WSB_CTRL_4SPRING = 20 ' springers < 4 Springs> '%WSB_CTRL_SHAKERS = 21 < Shake It> '%WSB_CTRL_SPRINGSHAKE = 22 < SpringShake> '%WSB_CTRL_SPRIN_INDIV = 31 ' tasknumber constants for WSB_SERVER: %wsb_listen = 16 ' tasknumber %ftp_listen = 17 %wsb_klung_notes_task = 32 ' tasks group 3 %wsb_thunderwood_notes_task = 33 %wsb_troms_notes_task = 34 %wsb_springers_notes_task = 35 %wsb_tutti_task = 36 ' 18.09.2000 gwr %klung_selector = 48 ' tasks group 4 %thunderwood_selector = 49 %troms_selector = 50 %springers_selector = 51 %statwindow = 52 '%kris = 53 %stoch = 54 FUNCTION Wsb_InitServer () AS LONG LOCAL m AS ASCIIZ * 40 LOCAL CockpitLayo AS CockpitLabels FUNCTION = %False ' check midi-in / out handles. IF ISFALSE hMidiI(0) THEN ErrorMidiIn : EXIT FUNCTION IF ISFALSE hMidiO(0) THEN ErrorMidiOut: EXIT FUNCTION ReadAppDataFromFile $WsbServIni ReadCockpitLabelsFromFile $WsbServIni, CockpitLayo ' remove unneeded and dangerous elements from cockpit: 'Adapt buttons to this application: ' SWITCHES: (these can toggle) ButnSW(0).tag0 = "" ' midi thru is a complete taboo here... ButnSW(0).tag1 = "" ButnSW(0).cptr = 0 ButnSW(1).tag0 = "START" ' start/stop toggle - must be pushed! ButnSW(1).tag1 = "STOP" 'ButnSW(1).cptr = use default starter. ButnSW(2).tag0 = "" ' "STAFF" ' creates/kills a music monitoring window ButnSW(3).tag0 = "" ' "USER" ' creates/kills a user feedback window ButnSW(4).tag0 = "Har On" ' creates/kills a harmony display window ButnSW(4).tag1 = "Har Off" ButnSW(5).tag0 = "" ButnSW(6).tag0 = "" ButnSW(7).tag0 = "Whisper" 'whisper mode, loud sounds not allowed ButnSW(7).tag1 = "Normal" ButnSw(7).cptr = CODEPTR(ToggleWhisperMode) ButnSW(8).tag0 = "" ButnSW(9).tag0 = "" ButnSW(10).tag0 = "" ButnSW(11).tag0 = "" ' ONE SHOT FUNCTIONS: ButnOS(1).tag = "" ButnOS(2).tag = "" ButnOS(3).tag = "" ButnOS(4).tag = "" ButnOS(5).tag = "" ButnOS(6).tag = "" ButnOS(7).tag = "" ButnOS(8).tag = "" ButnOS(9).tag = "" ' should become clear midi input buffer ButnOS(10).tag = "" ButnOS(11).tag = "" ' should become 'panic' button IF ISFALSE App.Tempo THEN MSGBOX "[Warning only]: tempo data for WSB not read from ini file..." App.tempo = 60 END IF ' reorient the function of cockpit slider0 to steer the general tempo in App.tempo Slider(0).value = App.tempo Slider(0).maxval = 120 Slider(0).minval = 30 Slider(0).resetval = App.tempo Slider(0).Cptr = CODEPTR(Wsb_slider_tempo) Slider(0).tag = "MM" SendMessage Slider(0).h, %TBM_SETPOS,%True, App.tempo ' reorient the function of the second cockpit slider to steer server responsiveness to midi input Slider(1).value = 100 Slider(1).maxval = 127 Slider(1).minval = 5 Slider(1).resetval = 100 Slider(1).Cptr = CODEPTR(Wsb_slider_responsiveness) Slider(1).tag = "Resp" SendMessage Slider(1).h, %TBM_SETPOS,%True, 100 task(%wsb_listen).naam = "listen" task(%wsb_listen).cptr = CODEPTR(Wsb_Listen) task(%wsb_listen).freq = Slider(1).resetval * 10 ' =1000 ' 1000 should be the maximum needed! task(%ftp_listen).naam = "ftp-get" task(%ftp_listen).cptr = CODEPTR(Ftp_Listen) task(%ftp_listen).freq = 0.02 task(%wsb_klung_notes_task).naam = "Klung-Nt" task(%wsb_klung_notes_task).cPtr = CODEPTR(Wsb_Klung_Notes) task(%wsb_klung_notes_task).freq = App.tempo * 2 / 60! task(%wsb_klung_notes_task).flags = task(%wsb_klung_notes_task).flags OR %HARM_TASK task(%wsb_klung_notes_task).channel = %Klung_Channel task(%wsb_thunderwood_notes_task).naam = "Thund_Nt" task(%wsb_thunderwood_notes_task).cPtr = CODEPTR(Wsb_ThunderWood_Notes) task(%wsb_thunderwood_notes_task).freq = App.tempo * 3 / 60! task(%wsb_thunderwood_notes_task).flags = task(%wsb_thunderwood_notes_task).flags OR %HARM_TASK task(%wsb_thunderwood_notes_task).channel = %ThunderWood_Channel task(%wsb_troms_notes_task).naam = "Troms_Nt" task(%wsb_troms_notes_task).cPtr = CODEPTR(Wsb_Troms_Notes) task(%wsb_troms_notes_task).freq = App.tempo * 4 / 60! task(%wsb_troms_notes_task).flags = task(%wsb_troms_notes_task).flags OR %HARM_TASK task(%wsb_troms_notes_task).channel = %Troms_Channel task(%wsb_springers_notes_task).naam = "Sprin_Nt" task(%wsb_springers_notes_task).cPtr = CODEPTR(Wsb_Springers_Notes) task(%wsb_springers_notes_task).freq = App.tempo / 60! task(%wsb_springers_notes_task).flags = task(%wsb_springers_notes_task).flags OR %HARM_TASK task(%wsb_springers_notes_task).channel = %Springers_Channel task(%wsb_tutti_task).naam = "Tutti" ' new 18.09.2000 task(%wsb_tutti_task).cPtr = CODEPTR(Wsb_Tutti_Task) task(%wsb_tutti_task).freq = 60 task(%wsb_tutti_task).flags = task(%wsb_tutti_task).flags OR %HARM_TASK 'the id of a piece should be passed to this tasks pan fields. 0 = stop playing task(%klung_selector).naam = "Klung-S" task(%klung_selector).cptr = CODEPTR(Klung_piece_selector) task(%klung_selector).freq = 1 task(%Thunderwood_selector).naam = "Thund-S" task(%ThunderWood_selector).cptr = CODEPTR(ThunderWood_piece_selector) task(%ThunderWood_selector).freq = 1 task(%Troms_selector).naam = "Troms-S" task(%Troms_selector).cptr = CODEPTR(Troms_piece_selector) task(%Troms_selector).freq = 1 task(%Springers_selector).naam = "Sprin-S" task(%Springers_selector).cptr = CODEPTR(Springers_piece_selector) task(%Springers_selector).freq = 1 Task(%statwindow).naam="status" Task(%statWindow).cptr=CODEPTR(WSB_StatusWindow) Task(%statWindow).freq = 5 'only part of the window is updated @ every call Task(%stoch).naam = "Stoch" Task(%stoch).cptr = CODEPTR(Stoch_server) Task(%stoch).freq = 5 m = " - GMT-Server" Sendmessage gh.Cockpit, %WM_SETTEXT,0,VARPTR(m) LOCAL i AS LONG ' m="" 'ok. all are 0 here ' FOR i = 0 TO 31 ' m=STR$(votes.klung(i)) ' MSGBOX m ' NEXT ' MSGBOX m ReturnHandlerDlg FUNCTION = %True END FUNCTION SUB Wsb_Listen () LOCAL nv AS INTEGER LOCAL noot AS BYTE LOCAL value AS BYTE LOCAL msg AS DWORD LOCAL i AS LONG STATIC hDlg AS LONG ' interaction parameters: LOCAL nrpeople AS WORD LOCAL startstop AS WORD LOCAL winner AS WORD LOCAL dummy AS WORD STATIC nrsurf AS WORD 'check for real time messages 'get nr of visitors (song pos ptr) at any moment: ' following function can be called whenever required. It does not have to be in a task. ' it always returns the last updated value: nrpeople = SongPositionPointer (0,%G_SPP_GET,%Null) ' new function 15.09.2000 'swap lowest 7 and second lowest 7 bits ! 02/10/00 dummy = nrpeople AND &B1111111 SHIFT LEFT dummy, 7 SHIFT RIGHT nrpeople, 7 nrpeople = nrpeople OR dummy ' this number should not be updated any faster than once a second. ' at the slowest , once every 10 seconds. ' This to safeguard responsiveness. IF nrpeople THEN IF ISFALSE hDlg THEN hDlg=ReturnHandlerDlg CONTROL SET TEXT hDlg, 100, STR$(nrPeople) END IF ' nr of internetters (song select) nv = GetSongSelect (0,%REMOVE OR %OLDEST) IF nv > %NotFalse THEN nrsurf = LOBYT(nv) ' update nr. of surfers to wsb ' the TU server should parse their data files, translate them to midi msg's ' as for other participants and after sending them to this GMT_WSB server, ' decrease the number of participant with one unit. IF ISFALSE hDlg THEN hDlg=ReturnHandlerDlg CONTROL SET TEXT hDlg,101, STR$(nrsurf) END IF ' retrieve the flags for start / stop / continue: startstop = MidiStopStartCont (0, %G_SSC_GET,%Null) ' this is an extended dll function! IF (startstop AND %MIDI_STOP_RECEIVED) = %MIDI_STOP_RECEIVED THEN ' undertake appropriate action ' clear midi-in buffer ' all tasks off ' all notes off on all machines... ' reset all flags: MidiStopStartCont 0, %G_SSC_SET,%False 'message to WSB@instrument server task(%klung_Selector).pan = %false IF task(%klung_Selector).freq < 1 THEN Klung_piece_Selector 'call it immediately task(%ThunderWood_Selector).pan = %false IF task(%ThunderWood_Selector).freq < 1 THEN ThunderWood_piece_Selector 'call it immediately task(%Troms_Selector).pan = %false IF task(%Troms_Selector).freq < 1 THEN Troms_piece_Selector 'call it immediately task(%Springers_Selector).pan = %false IF task(%Springers_selector).freq < 1 THEN Springers_piece_Selector ' was... Klung_piece_Selector 'call it immediately 'stop server controlled pieces IF Votes.Klung(2) THEN StopTask %wsb_klung_notes_task IF Votes.ThunderWood(2) THEN StopTask %wsb_thunderwood_notes_task IF Votes.Troms(2) THEN StopTask %wsb_troms_notes_task IF Votes.Springers(2) THEN StopTask %wsb_springers_notes_task IF Votes.Klung(4) THEN StopTask %wsb_tutti_task ' index 4 = flag for tutti piece FOR i = 0 TO 31 Votes.Klung(i) = %False Votes.ThunderWood(i) = %False Votes.Troms(i)=%False Votes.Springers(i) = %False NEXT i ELSEIF (startstop AND %MIDI_START_RECEIVED) = %MIDI_START_RECEIVED THEN ' undertake appropriate action ' ... ' reset this flag, so that we do not start oscillating... MidiStopStartCont 0, %G_SSC_GETANDRESET,%MIDI_START_RECEIVED ' reset only this bit. ELSEIF (startstop AND %MIDI_CONT_RECEIVED) = %MIDI_CONT_RECEIVED THEN ' undertake appropriate action ' ... ' reset this flag, so that we do not start oscillating... MidiStopStartCont 0, %G_SSC_GETANDRESET,%MIDI_CONT_RECEIVED ' reset only this bit. END IF ' we can use the function for retrieval of tuning request, as well as for all undefined bytes in the midi ' protocol. (cfr. updated gmt midi manual) 'get controllers: 'all controllers values should be ranged 0-127, and are only remapped in the automat-specific procs 'we use same controllers for same param on same instrument in different pieces O.K. gwr ' Lets define these as: ' common controllers: ' level: %WSB_CTRL_VELO = 3 always causes %WSB_CHANGE_VELO messages ' speed: %WSB_CTRL_SPEED = 9 always causes %WSB_CHANGE_SPEED messages ' density: %WSB_CTRL_DENS = 14 always causes %WSB_CHANGE_DENSITY messages ' xxx %WSB_CTRL = 15 always causes ... messages ' not used yet. ' instrument specific controllers: ' Klung: 20-31 select compositions, 30 = tutti piece, 31 = individual note playing. ' ThunderWood: 20-31 ' Troms: 20-31 ' Springers: 20-31 ' nr 30, adds up for all instruments and causes tutti to start. ' received note-on commands from the TU server will increase the weight of that note in the har-string kept here. ' note ranges for our instruments do not overlap!, so a single har-string should do the job. ' Kristof has to remap his extended note support to conform... ' if an instrument is not selected by anyone, we should clean up the buffer for its data... and can skip the ' data retrieval code until the instrument becomes selected. ' If an instrument is selected , but no piece for it is choosen, we should start the interactive ' note playing tasks. (32-33-34-35). These should already work. ' KLUNG SEKTIE: nv = GetProgChange%(%Klung_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN ' MSGBOX HEX$(nv) Votes.Klung(0) = nv ' reflects number of people that have data for klung EXIT SUB 'without this exit sub, we fail getting a following controller! END IF 'note: this value remains static until the TU server sends another value. IF Votes.Klung(0) > %False THEN ' retrieve votes for compositional structures: nv = GetController(%Klung_Channel, %WSB_CTRL_KLUNGELS, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_KLUNGELS) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_STOCHLUNG, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_STOCHLUNG) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_THOMAS, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_THOMAS) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_TANGO, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_TANGO) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_GRAYS, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_GRAYS) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_TUTTI, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_TUTTI) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Klung_Channel, %WSB_CTRL_KLUNG_INDIV, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.klung(%WSB_CTRL_KLUNG_INDIV) = LOBYT(nv) ' aantal stemmen END IF ' now find out who won the election...: winner = MAX(Votes.Klung(%WSB_CTRL_KLUNGELS),_ Votes.Klung(%WSB_CTRL_STOCHLUNG),_ Votes.Klung(%WSB_CTRL_THOMAS),_ Votes.Klung(%WSB_CTRL_TANGO),_ Votes.Klung(%WSB_CTRL_GRAYS),_ Votes.Klung(%WSB_CTRL_TUTTI),_ Votes.Klung(%WSB_CTRL_KLUNG_INDIV)) 'note: winner contains the nr of votes for the winner, not ' the winners id IF winner THEN ' now look up with which piece this corresponds: FOR i = 20 TO 31 IF Votes.Klung(i) = winner THEN Votes.Klung(1)= i: EXIT FOR NEXT i ELSE Votes.Klung(1) = %False ' no piece selected. END IF ' and send an appropriate message to the Klung server... ' task(%klung_selector).pan = Votes.klung(1) 'pass choice to task responsible for selection. 0 = stop SELECT CASE Votes.Klung(1) CASE 0 ' in this case, if we had a piece playing, we may stop it, or just let it end... IF Votes.Klung(2) THEN StopTask %wsb_klung_notes_task Votes.Klung(2) = %False END IF CASE 20,21,22,23,24 ' retrieve parameters: nv = GetController(%Klung_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN value = LOBYT(nv) msg = %WSB_CHANGE_VELO OR value KlungHandler msg END IF nv = GetController(%Klung_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_SPEED OR value KlungHandler msg END IF nv = GetController(%Klung_Channel, %WSB_CTRL_DENS, %REMOVE OR %OLDEST) 'density IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_DENSITY OR value KlungHandler msg END IF CASE 30 ' for tutti piece nv = GetController(%Klung_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN Votes.Klung(%WSB_CTRL_VELO) = LOBYT(nv) nv = GetController(%Klung_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN Votes.Klung(%WSB_CTRL_SPEED) = LOBYT(nv) nv = GetMidiNote(%Klung_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo, this should be recalculated according to nrPeople!! no, allreqdy done by tue IF Whispermode THEN value = value \ 6 noot = HIBYT (nv) IF (noot > 47) AND (noot < 70) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF CASE 31 ' now retrieve note on/off messages: nv = GetMidiNote(%Klung_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo, this should be recalculated according to nrPeople!! noot = HIBYT (nv) IF (noot > 47) AND (noot < 70) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF IF ISFALSE Votes.Klung(2) THEN StartTask %wsb_klung_notes_Task Votes.Klung(2) = %True IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg END IF CONTROL SET TEXT hdlg,1, STR$(%WSB_CTRL_KLUNG_INDIV) END IF END SELECT ELSE ' no votes for Klung... ' in this case we should disregard any data for klung. ' we should reset the votes for the pieces as well: FOR i = 20 TO 31 Votes.Klung(i)= %False NEXT i 'task(%klung_selector).pan = %false 'MAT ZER Votes.Klung() does not work with arrays within types... Votes.Klung(1)=%False IF Votes.Klung(2) THEN StopTask %wsb_klung_notes_Task Votes.Klung(2) = %False END IF 'msg to messagehandler END IF ' THUNDERWOOD SEKTIE: ( using %ThunderWood_Channel) **************************************************** nv = GetProgChange%(%ThunderWood_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN 'MSGBOX HEX$(nv) Votes.ThunderWood(0) = nv ' reflects number of people that have data for thunderwood EXIT SUB END IF IF Votes.ThunderWood(0) > %False THEN ' retrieve votes for compositional structures: nv = GetController(%ThunderWood_Channel, %WSB_CTRL_WOODY, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.thunderwood(%WSB_CTRL_WOODY) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%ThunderWood_Channel, %WSB_CTRL_WOODSTOCH, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.thunderwood(%WSB_CTRL_WOODSTOCH) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%ThunderWood_Channel, %WSB_CTRL_TUTTI, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.thunderwood(%WSB_CTRL_TUTTI) = LOBYT(nv) ' aantal stemmen - added later on END IF nv = GetController(%ThunderWood_Channel, %WSB_CTRL_THUND_INDIV, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.thunderwood(%WSB_CTRL_THUND_INDIV) = LOBYT(nv) ' aantal stemmen END IF ' now find out who won the election...: winner = MAX(Votes.Thunderwood(%WSB_CTRL_WOODY),_ Votes.Thunderwood(%WSB_CTRL_WOODSTOCH),_ Votes.Thunderwood(%WSB_CTRL_TUTTI),_ Votes.Thunderwood(%WSB_CTRL_THUND_INDIV)) IF winner THEN ' now look up with which piece this corresponds: FOR i = %WSB_CTRL_WOODY TO %WSB_CTRL_THUND_INDIV IF Votes.thunderwood(i) = winner THEN Votes.ThunderWood(1)= i: EXIT FOR NEXT i ELSE Votes.ThunderWood(1) = %False END IF ' and send an appropriate message to the Thunderwood server... ' task(%Thunderwood_selector).pan = Votes.Thunderwood(1) 'pass choice to task responsible for selection SELECT CASE Votes.ThunderWood(1) CASE 0 ' cfr. klung section IF Votes.ThunderWood(2) THEN StopTask %wsb_thunderwood_notes_task Votes.ThunderWood(2) = %False END IF CASE 20,21 ' controller retrieval code... nv = GetController(%ThunderWood_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN value = LOBYT(nv) msg = %WSB_CHANGE_VELO OR value ThunderWoodHandler msg END IF nv = GetController(%ThunderWood_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_SPEED OR value ThunderWoodHandler msg END IF nv = GetController(%ThunderWood_Channel, %WSB_CTRL_DENS, %REMOVE OR %OLDEST) 'density IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_DENSITY OR value ThunderWoodHandler msg END IF CASE 30 ' for tutti piece nv = GetController(%ThunderWood_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN Votes.ThunderWood(%WSB_CTRL_VELO) = LOBYT(nv) nv = GetController(%ThunderWood_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN Votes.ThunderWood(%WSB_CTRL_SPEED) = LOBYT(nv) nv = GetMidiNote(%ThunderWood_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo noot = HIBYT (nv) IF Whispermode THEN value = value / 4 IF (noot > 0) AND (noot < 25) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF CASE 31 ' now retrieve note on/off messages: nv = GetMidiNote(%ThunderWood_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo noot = HIBYT (nv) IF (noot > 0) AND (noot < 25) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF IF ISFALSE Votes.ThunderWood(2) THEN StartTask %wsb_thunderwood_notes_task Votes.ThunderWood(2) = %True IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg END IF CONTROL SET TEXT hdlg,11, STR$(%WSB_CTRL_THUND_INDIV) END IF END SELECT ELSE ' no votes for thunderwood... ' in this case we should disregard any data for ThunderWood. FOR i = 20 TO 31 Votes.ThunderWood(i)= %False NEXT i 'task(%ThunderWood_selector).pan = %false Votes.ThunderWood(1)= %False IF Votes.ThunderWood(2) THEN StopTask %wsb_thunderwood_notes_task Votes.ThunderWood(2) = %False END IF END IF ' TROMS_SEKTIE: ( using %Troms_Channel) ******************************************************** nv = GetProgChange%(%Troms_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN ' MSGBOX HEX$(nv) Votes.Troms(0) = nv ' reflects number of people that have data for thunderwood EXIT SUB END IF IF Votes.Troms(0) > %False THEN ' piece elections... ' retrieve votes for compositional structures: nv = GetController(%Troms_Channel, %WSB_CTRL_ETROMS, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.troms(%WSB_CTRL_ETROMS) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Troms_Channel, %WSB_CTRL_STOCHTROM, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.troms(%WSB_CTRL_STOCHTROM) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Troms_Channel, %WSB_CTRL_AFROTROM, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.troms(%WSB_CTRL_AFROTROM) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Troms_Channel, %WSB_CTRL_TUTTI, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.troms(%WSB_CTRL_TUTTI) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Troms_Channel, %WSB_CTRL_TROMS_INDIV, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.troms(%WSB_CTRL_TROMS_INDIV) = LOBYT(nv) ' aantal stemmen END IF ' now find out who won the election...: winner = MAX(Votes.Troms(%WSB_CTRL_ETROMS),_ Votes.Troms(%WSB_CTRL_STOCHTROM),_ Votes.Troms(%WSB_CTRL_AFROTROM),_ Votes.Troms(%WSB_CTRL_TUTTI),_ Votes.Troms(%WSB_CTRL_TROMS_INDIV)) IF winner THEN ' now look up with which piece this corresponds: FOR i = %WSB_CTRL_ETROMS TO %WSB_CTRL_TROMS_INDIV IF Votes.troms(i) = winner THEN Votes.Troms(1)= i: EXIT FOR ' index 1= piece ID NEXT i ELSE Votes.Troms(1)= %False ' reset number of selected piece END IF ' and send an appropriate message to the Troms server... '... we have to agree on a standard for this message. ' of course it has to be implemented in the Troms listen task as well (Troms server code) ' task(%troms_selector).pan = Votes.Troms(1) 'pass choice to task responsible for selection SELECT CASE Votes.Troms(1) CASE 0 ' ... IF Votes.Troms(2) THEN ' index 2: flag for indiv. playing tasks StopTask %wsb_troms_notes_task Votes.troms(2) = %False END IF CASE 20,21,22 ' one piece was still missing. Added 16.10.2000 gwr ' controller retrieval code... nv = GetController(%Troms_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN value = LOBYT(nv) msg = %WSB_CHANGE_VELO OR value TromsHandler msg END IF nv = GetController(%Troms_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_SPEED OR value TromsHandler msg END IF nv = GetController(%Troms_Channel, %WSB_CTRL_DENS, %REMOVE OR %OLDEST) 'density IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_DENSITY OR value TromsHandler msg END IF CASE 30 ' for tutti piece nv = GetController(%Troms_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN Votes.Troms(%WSB_CTRL_VELO) = LOBYT(nv) nv = GetController(%Troms_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN Votes.Troms(%WSB_CTRL_SPEED) = LOBYT(nv) nv = GetMidiNote(%Troms_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo noot = HIBYT (nv) IF WhisperMode THEN value = value \ 5 IF (noot > 23) AND (noot < 48) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF CASE 31 ' now retrieve note on/off messages: nv = GetMidiNote(%Troms_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo noot = HIBYT (nv) IF (noot > 23) AND (noot < 48) THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF IF ISFALSE Votes.Troms(2) THEN StartTask %wsb_troms_notes_task Votes.troms(2) = %True CONTROL SET TEXT hdlg,21, STR$(%WSB_CTRL_TROMS_INDIV) IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg END IF END IF END SELECT ELSE ' no votes for Troms... ' in this case we should disregard any data for Troms. FOR i = 20 TO 31 Votes.Troms(i)= %False NEXT i 'task(%Troms_selector).pan = %false Votes.Troms(1) = %False IF Votes.Troms(2) THEN StopTask %wsb_troms_notes_task Votes.troms(2) = %False END IF END IF 'SPRINGERS_SEKTIE: ( using %Springers_Channel) ********************************************************** nv = GetProgChange%(%Springers_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.Springers(0) = nv ' reflects number of people that have data for Springers EXIT SUB END IF IF Votes.Springers(0) > %False THEN ' piece elections... ' retrieve votes for compositional structures: nv = GetController(%Springers_Channel, %WSB_CTRL_4SPRING, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.springers(%WSB_CTRL_4SPRING) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Springers_Channel, %WSB_CTRL_SHAKERS, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.springers(%WSB_CTRL_SHAKERS) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Springers_Channel, %WSB_CTRL_SPRINGSHAKE, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.springers(%WSB_CTRL_SPRINGSHAKE) = LOBYT(nv) ' added 12.10.2000 END IF nv = GetController(%Springers_Channel, %WSB_CTRL_TUTTI, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.springers(%WSB_CTRL_TUTTI) = LOBYT(nv) ' aantal stemmen END IF nv = GetController(%Springers_Channel, %WSB_CTRL_SPRIN_INDIV, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN Votes.springers(%WSB_CTRL_SPRIN_INDIV) = LOBYT(nv) ' aantal stemmen END IF ' now find out who won the election...: winner = MAX(Votes.Springers(%WSB_CTRL_4SPRING),_ Votes.Springers(%WSB_CTRL_SHAKERS),_ Votes.Springers(%WSB_CTRL_SPRINGSHAKE),_ Votes.Springers(%WSB_CTRL_TUTTI),_ Votes.Springers(%WSB_CTRL_SPRIN_INDIV)) IF winner THEN ' now look up with which piece this corresponds: FOR i = 20 TO 31 IF Votes.Springers(i) = winner THEN Votes.Springers(1)= i: EXIT FOR NEXT i ELSE Votes.Springers(1) = %False END IF ' and send an appropriate message to the Springs server... '... we have to agree on a standard for this message. ' of course it has to be implemented in the Springers listen task as well (Springers server code) 'task(%Springers_selector).pan = Votes.Springers(1) 'pass choice to task responsible for selection SELECT CASE Votes.Springers(1) CASE 0 ' ... IF Votes.Springers(2) THEN StopTask %wsb_springers_notes_task Votes.springers(2) = %False END IF CASE 20,21,22 ' controller retrieval code... nv = GetController(%Springers_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN value = LOBYT(nv) msg = %WSB_CHANGE_VELO OR value SpringersHandler msg END IF nv = GetController(%Springers_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_SPEED OR value SpringersHandler msg END IF nv = GetController(%Springers_Channel, %WSB_CTRL_DENS, %REMOVE OR %OLDEST) 'density IF nv > %NOTFALSE THEN value = LOBYT (nv) msg = %WSB_CHANGE_DENSITY OR value SpringersHandler msg END IF CASE 30 ' for tutti piece nv = GetController(%Springers_Channel, %WSB_CTRL_VELO, %REMOVE OR %OLDEST) 'velo (0 - 127) IF nv > %NotFalse THEN Votes.Springers(%WSB_CTRL_VELO) = LOBYT(nv) nv = GetController(%Springers_Channel, %WSB_CTRL_SPEED, %REMOVE OR %OLDEST) 'speed IF nv > %NOTFALSE THEN Votes.Springers(%WSB_CTRL_SPEED) = LOBYT(nv) nv = GetMidiNote(%Springers_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo is allready scaled by TU server! noot = HIBYT (nv) IF WhisperMode THEN value = value \ 5 IF noot > 119 THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF CASE 31 ' now retrieve note on/off messages: nv = GetMidiNote(%Springers_Channel, %REMOVE OR %OLDEST) IF nv > %NotFalse THEN value = LOBYT (nv) ' velo is allready scaled by TU server! noot = HIBYT (nv) IF noot > 119 THEN ' filter for wrong notes... DelNote2Har Task(%wsb_listen).Har, noot IF value THEN AddNote2Har Task(%wsb_listen).Har, noot, value END IF END IF IF ISFALSE Votes.Springers(2) THEN StartTask %wsb_springers_notes_task ' MSGBOX "starting snt" 'ok Votes.springers(2) = %True CONTROL SET TEXT hdlg,31, STR$(%WSB_CTRL_SPRIN_INDIV) IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg END IF END IF END SELECT ELSE ' no votes for Springers... ' in this case we should disregard any data for Springers. FOR i = 20 TO 31 Votes.Springers(i)= %False NEXT i 'task(%Springers_selector).pan = %false Votes.Springers(1)= %False IF Votes.Springers(2) THEN StopTask %wsb_springers_notes_task Votes.springers(2) = %False END IF END IF ' ------------------------------------------------------------------ ' code to decide whether we have to start the tutti 'composition'... IF Votes.Klung(1) = %WSB_CTRL_TUTTI THEN IF Votes.ThunderWood(1) = %WSB_CTRL_TUTTI THEN IF Votes.Troms(1) = %WSB_CTRL_TUTTI THEN IF Votes.Springers(1) = %WSB_CTRL_TUTTI THEN IF Votes.Klung(2) THEN StopTask %wsb_klung_notes_task Votes.Klung(2) = %False END IF IF Votes.ThunderWood(2) THEN StopTask %wsb_thunderwood_notes_task Votes.ThunderWood(2) = %False END IF IF Votes.Troms(2) THEN StopTask %wsb_troms_notes_task Votes.Troms(2) = %False END IF IF Votes.Springers(2) THEN StopTask %wsb_springers_notes_task Votes.Springers(2) = %False END IF IF ISFALSE Votes.Klung(4)THEN ' this holds the on-off flag StartTask %wsb_tutti_task Votes.Klung(4) = %True END IF ELSE IF Votes.Klung(4) THEN StopTask %wsb_tutti_task Votes.Klung(4) = %False END IF END IF ELSE IF Votes.Klung(4) THEN StopTask %wsb_tutti_task Votes.Klung(4) = %False END IF END IF ELSE IF Votes.Klung(4) THEN StopTask %wsb_tutti_task Votes.Klung(4) = %False END IF END IF ELSE IF Votes.Klung(4) THEN StopTask %wsb_tutti_task Votes.Klung(4) = %False END IF END IF 'test dummys ' KlungHandler %WSB_CHANGE_VELO OR INT(RND*127) END SUB SUB Ftp_Listen ' this is to be written: download and parse the files from contributing users. LOCAL i AS LONG LOCAL fn AS LONG LOCAL result& LOCAL buffer$ STATIC hFtpThread AS DWORD 'LONG STATIC hDlg AS LONG DIM filnams(0 TO 10000) AS LOCAL STRING' 10000 = %BUFFERSIZE in g_ftp.dll - resized in g_ftp_get function ON ERROR GOTO fout IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg IF hFtpThread THEN THREAD STATUS hFtpThread TO result& SELECT CASE result CASE &H103 'still busy... CASE -1 'thread finished- no new files THREAD CLOSE hFtpThread TO result& hFtpThread = 0 THREAD CREATE FTP_GetFiles(0) TO hFtpThread CASE 1 'thread finished THREAD CLOSE hFtpThread TO result& IF ISFALSE result& THEN CONTROL GET TEXT hDlg, 200 TO buffer$ buffer$ = buffer$ + CHR$(13) + "failed closing finished thread" CONTROL SET TEXT hDlg, 200, buffer$ END IF 'parse new files: FTP_InputHandler hFtpThread = 0 THREAD CREATE FTP_GetFiles(0) TO hFtpThread IF ISFALSE hFtpThread THEN CONTROL GET TEXT hDlg, 200 TO buffer$ buffer$ = buffer$ + CHR$(13) + "failed creating thread" CONTROL SET TEXT hDlg, 200, buffer$ END IF END SELECT ELSE CONTROL SET TEXT hDlg, 200, "initiate new thread..." THREAD CREATE FTP_GetFiles(0) TO hFtpThread IF ISFALSE hFtpThread THEN CONTROL GET TEXT hDlg, 200 TO buffer$ buffer$ = buffer$ + CHR$(13) + "failed creating thread" CONTROL SET TEXT hDlg, 200, buffer$ END IF END IF EXIT SUB fout: END SUB FUNCTION FTP_getFiles(BYVAL dummy AS DWORD) AS LONG LOCAL i AS LONG LOCAL filnams() AS STRING LOCAL fn AS LONG FUNCTION = %false DIM filnams(0 TO 10000) MSGBOX "getfiles..." g_ftp_setuser "logosfou", "stigting" ' i = g_ftp_get("logosfoundation-anonftp/incoming/wsb",filnams()) ' gives compilation error... IF i < 0 THEN 'failed FUNCTION = -1 EXIT FUNCTION END IF fn = FREEFILE OPEN "dldfiles.txt" FOR OUTPUT AS fn FOR i = LBOUND(filnams) TO UBOUND(filnams) PRINT #fn, filnams(i) NEXT PRINT #fn, "[EOF]" CLOSE fn FUNCTION = 1 END FUNCTION FUNCTION FTP_InputHandler AS LONG LOCAL i AS LONG LOCAL fn AS LONG LOCAL buffer$ 'parses files that come via ftp fn = FREEFILE OPEN "dldfiles.txt" FOR INPUT AS fn DIM filnams(0 TO 10000) AS LOCAL STRING i = -1 DO UNTIL EOF (fn) INPUT #fn, buffer$ ' CONTROL SET TEXT hDlg, 200, "from file: " + buffer$ IF buffer$ = "[EOF]" THEN EXIT LOOP INCR i filnams(i) = buffer$ LOOP CLOSE #fn fn = FREEFILE OPEN "dldfiles.txt" FOR OUTPUT AS fn PRINT# fn, "[EOF]" IF i > -1 THEN 'we've got new files!! REDIM PRESERVE filnams(0 TO i) MSGBOX STR$(i) + " files" FOR i = LBOUND(filnams) TO UBOUND(filnams) '----------->parse files<------------------- fn = FREEFILE OPEN filnams(i) FOR INPUT AS fn NEXT END IF END FUNCTION SUB ToggleWhisperMode () STATIC tog AS DWORD IF ISFALSE WhisperMode THEN WhisperMode = %true ProgChange %klung_channel, 32 ProgChange %thunderwood_channel, 32 ProgChange %troms_channel, 32 ProgChange %springers_channel, 32 Play %klung_channel, 127,0 Play %klung_channel, 127,0 Play %klung_channel, 127,0 Play %klung_channel, 127,0 Play %thunderwood_channel, 127,0 Play %thunderwood_channel, 127,0 Play %thunderwood_channel, 127,0 Play %thunderwood_channel, 127,0 Play %troms_channel, 127,0 Play %troms_channel, 127,0 Play %troms_channel, 127,0 Play %troms_channel, 127,0 Play %troms_channel, 127,0 Play %springers_channel, 127,0 ' note that this is an existing note on springers! Play %springers_channel, 127,0 Play %springers_channel, 127,0 Play %springers_channel, 127,0 Klung_Piece_Selector Thunderwood_Piece_Selector Troms_Piece_Selector Springers_Piece_Selector ELSE WhisperMode = %false ProgChange %klung_channel, 33 ProgChange %thunderwood_channel, 33 ProgChange %troms_channel, 33 ProgChange %springers_channel, 33 ' warning "whisper mode off",500 END IF END SUB FUNCTION KlungHandler (BYVAL msg AS WORD) AS BYTE ' meta-command handler for musical algorithms and processes on Klung. STATIC velo AS BYTE 'initialize for a piece ? STATIC speed AS BYTE STATIC density AS BYTE FUNCTION = %False ' there should be a default return value. Is false o.k.??? (gwr) IF WhisperMode THEN EXIT FUNCTION 'we only do server-side pieces in whispermode ' MSGBOX "klung:" + HEX$(msg) SELECT CASE HIBYT(msg) CASE HIBYT(%WSB_CHANGE_VELO) velo =( ( 3% * velo ) + LOBYT(msg) ) / 4 ModeMess %Klung_Channel, %WSB_CTRL_VELO, velo 'send integrated value to klungs computer& TU server votes.klung(%WSB_CTRL_VELO)=velo CASE HIBYT(%WSB_CHANGE_SPEED) speed =( ( 3% * speed ) + LOBYT(msg) )/4 ModeMess %Klung_Channel, %WSB_CTRL_SPEED, speed votes.klung(%WSB_CTRL_SPEED) = speed CASE HIBYT(%WSB_CHANGE_DENSITY) density =( ( 3% * density ) + LOBYT(msg) )/4 ModeMess %Klung_Channel, %WSB_CTRL_DENS, density votes.klung(%WSB_CTRL_DENS) = density CASE HIBYT(%WSB_RETURN_VELO) FUNCTION = velo CASE HIBYT(%WSB_RETURN_SPEED) FUNCTION = speed CASE HIBYT(%WSB_RETURN_DENSITY) FUNCTION = density CASE ELSE END SELECT END FUNCTION FUNCTION ThunderWoodHandler (BYVAL msg AS WORD) AS BYTE STATIC velo AS BYTE STATIC speed AS BYTE STATIC density AS BYTE ' MSGBOX "twhandler..."+HEX$(msg) FUNCTION = %False IF WhisperMode THEN EXIT FUNCTION 'we only do server-side pieces in whispermode SELECT CASE HIBYT(msg) CASE HIBYT(%WSB_CHANGE_VELO) velo =( ( 3% * velo ) + LOBYT(msg) ) / 4 ModeMess %ThunderWood_Channel, %WSB_CTRL_VELO, velo 'send integrated value to thunderwoods computer& TU server votes.Thunderwood(%WSB_CTRL_VELO) = velo CASE HIBYT(%WSB_CHANGE_SPEED) speed =( ( 3% * speed ) + LOBYT(msg) )/4 ModeMess %ThunderWood_Channel, %WSB_CTRL_SPEED, speed votes.thunderwood(%WSB_CTRL_SPEED) = speed CASE HIBYT(%WSB_CHANGE_DENSITY) density =( ( 3% * density ) + LOBYT(msg) )/4 ModeMess %ThunderWood_Channel, %WSB_CTRL_DENS, density votes.thunderwood(%WSB_CTRL_DENS) = density CASE HIBYT(%WSB_RETURN_VELO) FUNCTION = velo CASE HIBYT(%WSB_RETURN_SPEED) FUNCTION = speed CASE HIBYT(%WSB_RETURN_DENSITY) FUNCTION = density END SELECT END FUNCTION FUNCTION TromsHandler (BYVAL msg AS WORD) AS BYTE STATIC velo AS BYTE STATIC speed AS BYTE STATIC density AS BYTE FUNCTION = %False IF WhisperMode THEN EXIT FUNCTION 'we only do server-side pieces in whispermode SELECT CASE HIBYT(msg) CASE HIBYT(%WSB_CHANGE_VELO) velo =( ( 3% * velo ) + LOBYT(msg) ) / 4 ModeMess %Troms_Channel, %WSB_CTRL_VELO, velo 'send integrated value to troms computer& TU server votes.troms(%WSB_CTRL_VELO) = velo CASE HIBYT(%WSB_CHANGE_SPEED) speed =( ( 3% * speed ) + LOBYT(msg) )/4 ModeMess %Troms_Channel, %WSB_CTRL_SPEED, speed votes.troms(%WSB_CTRL_SPEED) = speed CASE HIBYT(%WSB_CHANGE_DENSITY) density =( ( 3% * density ) + LOBYT(msg) )/4 ModeMess %Troms_Channel, %WSB_CTRL_DENS, density votes.troms(%WSB_CTRL_DENS) = density CASE HIBYT(%WSB_RETURN_VELO) FUNCTION = velo CASE HIBYT(%WSB_RETURN_SPEED) FUNCTION = speed CASE HIBYT(%WSB_RETURN_DENSITY) FUNCTION = density CASE ELSE END SELECT END FUNCTION FUNCTION SpringersHandler (BYVAL msg AS WORD) AS BYTE STATIC velo AS BYTE STATIC speed AS BYTE STATIC density AS BYTE FUNCTION = %False IF WhisperMode THEN EXIT FUNCTION 'we only do server-side pieces in whispermode SELECT CASE HIBYT(msg) CASE HIBYT(%WSB_CHANGE_VELO) velo =( ( 3% * velo ) + LOBYT(msg) ) / 4 ModeMess %Springers_Channel, %WSB_CTRL_VELO, velo 'send integrated value to Springers computer& TU server votes.springers(%WSB_CTRL_VELO) = velo CASE HIBYT(%WSB_CHANGE_SPEED) speed =( ( 3% * speed ) + LOBYT(msg) )/4 ModeMess %Springers_Channel, %WSB_CTRL_SPEED, speed votes.springers(%WSB_CTRL_SPEED) = speed CASE HIBYT(%WSB_CHANGE_DENSITY) density =( ( 3% * density ) + LOBYT(msg) )/4 ModeMess %Springers_Channel, %WSB_CTRL_DENS, density votes.springers(%WSB_CTRL_DENS) = density CASE HIBYT(%WSB_RETURN_VELO) FUNCTION = velo CASE HIBYT(%WSB_RETURN_SPEED) FUNCTION = speed CASE HIBYT(%WSB_RETURN_DENSITY) FUNCTION = density CASE ELSE END SELECT END FUNCTION SUB Wsb_Klung_Notes () ' task 32 STATIC i AS LONG ' notecounter STATIC j AS LONG LOCAL ib AS BYTE LOCAL ob AS BYTE STATIC tog AS BYTE STATIC pattern() AS LONG IF ISFALSE tog THEN DIM pattern(0 TO 20) AS STATIC LONG ' 21 notes in Klung i= %False FOR j = 0 TO 127 IF Gray(j) > 47 AND Gray(j) < 70 THEN ' range 48-69 IF Gray(j) <> 68 THEN ' note 68 is missing pattern(i) = Gray(j) INCR i END IF END IF NEXT j j = %False tog = %True END IF ' parses the Har$ in wsb_listen for klung notes. ' these parsers run at their own pace. ' The advantage is that we can limit the dataflow as well as controll the ' rhythmical properties of the global result. ' we use Task(%wsb_listen).Har as input. ' on each call of this task a different possible note is checked and played, if set. ' As now, we run of the scale, in Gray pattern. This should become an always changing pattern!!! ' klung notes + 1 i = Pattern(j) +1 ib = ASC(MID$(Task(%wsb_listen).Har.vel, i, 1)) ' this is the velo value ob = ASC(MID$(Task(%wsb_klung_notes_task).Har.vel, i, 1)) IF ISFALSE ib THEN IF ob THEN NoteOff %Klung_channel, i -1 ' to Klung as well as to TU server DelNote2Har Task(%wsb_klung_notes_task).Har, i-1 END IF ELSE IF ob <> ib THEN IF ob THEN NoteOff %Klung_channel, i - 1 ' to Klung as well as to TU server DelNote2Har Task(%wsb_klung_notes_task).Har, i-1 END IF IF Whispermode THEN 'limit velo ib = ib \ 7 IF ib < 8 THEN ib = 8 END IF Play %Klung_channel, i - 1, ib ' to Klung as well as to TU server DelNote2Har Task(%wsb_listen).Har, i-1 ' delete the note in the source. AddNote2Har Task(%wsb_klung_notes_task).Har, i-1, ib ' save the played note END IF END IF INCR j IF j > UBOUND(Pattern) THEN j = %False Task(%wsb_klung_notes_task).freq = App.tempo * 2 / 60! ' basis is nu 2 Hz END SUB SUB Wsb_ThunderWood_Notes () ' task 33 STATIC i AS LONG ' notecounter LOCAL ib AS BYTE LOCAL ob AS BYTE IF i < 2 THEN i = 2 ' lowest note is 1 - no filter yet ... IF i > 25 THEN i = 2 ib = ASC(MID$(Task(%wsb_listen).Har.vel, i, 1)) ' this is the velo value ob = ASC(MID$(Task(%wsb_thunderwood_notes_task).Har.vel, i, 1)) IF ISFALSE ib THEN IF ob THEN NoteOff %ThunderWood_channel, i -1 DelNote2Har Task(%wsb_thunderwood_notes_task).Har, i-1 END IF ELSE IF ob <> ib THEN IF ob THEN NoteOff %ThunderWood_channel, i - 1 DelNote2Har Task(%wsb_thunderwood_notes_task).Har, i-1 END IF SELECT CASE (i-1) CASE 1 TO 14 ', 17 TO 20 'woodblocks, chimes, thundersheet IF WhisperMode THEN ib = 1 + ib \ 10 IF ib < 3 THEN ib = 3 END IF Play %Thunderwood_channel, i - 1, ib CASE 17 TO 20 IF WhisperMode THEN ib = 1 + ib \ 8 IF ib < 5 THEN ib = 5 END IF Play %Thunderwood_channel, i - 1, ib CASE 15 'ratchet IF ISFALSE WhisperMode THEN Play %Thunderwood_channel, i - 1, ib CASE 16, 24 'rain, wind 'we should start rain resp. wind for a while... IF WhisperMode THEN ib = 1 + ib \ 8 IF ib < 5 THEN ib = 5 END IF Play %Thunderwood_channel, i - 1, ib CASE 23 Play %Thunderwood_channel, i - 1, ib END SELECT DelNote2Har Task(%wsb_listen).Har, i-1 ' delete the note in the source. AddNote2Har Task(%wsb_thunderwood_notes_task).Har, i-1, ib ' save the played note END IF END IF INCR i END SUB SUB Wsb_Troms_Notes () ' 34 STATIC i AS LONG ' notecounter LOCAL ib AS BYTE LOCAL ob AS BYTE IF i < 25 THEN i = 25 ' lowest note is 1 - no filter yet ... IF i > 48 THEN i = 25 ib = ASC(MID$(Task(%wsb_listen).Har.vel, i, 1)) ' this is the velo value ob = ASC(MID$(Task(%wsb_troms_notes_task).Har.vel, i, 1)) IF ISFALSE ib THEN IF ob THEN NoteOff %Troms_channel, i -1 DelNote2Har Task(%wsb_troms_notes_task).Har, i-1 END IF ELSE IF ob <> ib THEN IF ob THEN NoteOff %Troms_channel, i - 1 DelNote2Har Task(%wsb_troms_notes_task).Har, i-1 END IF IF WhisperMode THEN ib = 1 + ib\ 6 IF ib < 5 THEN ib = 5 END IF Play %Troms_channel, i - 1, ib DelNote2Har Task(%wsb_listen).Har, i-1 ' delete the note in the source. AddNote2Har Task(%wsb_troms_notes_task).Har, i-1, ib ' save the played note END IF END IF INCR i END SUB SUB Wsb_Springers_Notes () ' 35 STATIC i AS LONG ' notecounter LOCAL ib AS BYTE LOCAL ob AS BYTE IF i < 120 THEN i = 120 ' lowest note is 120 - no filter yet ... IF i > 128 THEN i = 120 ' geen zwaailicht en geen sirene hier... ib = ASC(MID$(Task(%wsb_listen).Har.vel, i, 1)) ' this is the velo value ob = ASC(MID$(Task(%wsb_springers_notes_task).Har.vel, i, 1)) IF ISFALSE ib THEN IF ob THEN NoteOff %Springers_channel, i -1 DelNote2Har Task(%wsb_springers_notes_task).Har, i-1 END IF ELSE IF ob <> ib THEN IF ob THEN NoteOff %Springers_channel, i - 1 DelNote2Har Task(%wsb_springers_notes_task).Har, i-1 END IF SELECT CASE ib CASE 124 TO 128 Play %springers_channel, i-1, ib 'IF ISFALSE WhisperMode THEN Play %Springers_channel, i - 1, ib CASE 120 TO 123 IF WhisperMode THEN ib = 1 + ib \ 10 ' MSGBOX "play"+STR$(%springers_channel) + STR$(i-1) + STR$(ib) Play %Springers_channel, i - 1, ib END SELECT DelNote2Har Task(%wsb_listen).Har, i-1 ' delete the note in the source. AddNote2Har Task(%wsb_springers_notes_task).Har, i-1, ib ' save the played note END IF END IF INCR i END SUB SUB Wsb_Slider_Tempo () ' reoriented handler for the first cockpit slider. App.Tempo = Slider(0).value IF App.tempo > 120 THEN App.tempo = 120 IF App.tempo < 30 THEN App.tempo = 30 ' update cockpit text accordingly: SetDlgItemText gh.Cockpit,%GMT_TEXT_TEMPO,STR$(App.tempo) END SUB SUB Wsb_Slider_Responsiveness () ' reoriented handler for the second cockpit slider. ' This sets the task frequency for the listen task. Task(%wsb_listen).freq = Slider(1).value ' is the slider rescaled ??? Otherwize this would be way too slow. END SUB 'for selection of a piece, we use dedicated tasks that reschedule internally 'the piece people voted for should be passed by putting the piece id in the pan field of the task '26.09.2000 we send all values for pieces we get. the individual instrument server should reset on unknown values. 'so the TU SERVER knows when we start the tutti or individ. note playing, and we're sure that other pieces on the 'instrument server side are ended SUB Klung_Piece_Selector () STATIC Currentpiece AS LONG STATIC hDlg AS LONG IF WhisperMode THEN CurrentPiece = %false votes.klung(1) = %false task(%klung_selector).freq = 1 CONTROL SET TEXT hDlg,1," W" EXIT SUB 'klung is not allowed to play in whispermode! END IF IF ISFALSE hDlg THEN hDlg=ReturnHandlerDlg IF votes.klung(1) <> CurrentPiece THEN IF CurrentPiece = %WSB_CTRL_TUTTI THEN StopTask %wsb_tutti_task ELSEIF Votes.klung(2) THEN StopTask %wsb_klung_notes_task Votes.klung(2) = %false END IF CurrentPiece = votes.klung(1) 'send message to klung server ProgChange %klung_channel, BYVAL CurrentPiece CONTROL SET TEXT hDlg,1, STR$(CurrentPiece) IF ISFALSE CurrentPiece THEN task(%klung_selector).freq = 1 ELSE 'we wait 2' before we allow another piece to be played task(%klung_selector).freq =0.0083 '=1/120 'MSGBOX "klung selector low" END IF EXIT SUB END IF task(%klung_selector).freq = 1 END SUB SUB ThunderWood_Piece_Selector () STATIC Currentpiece AS LONG STATIC hDlg AS LONG IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg IF WhisperMode THEN CurrentPiece = %false votes.thunderwood(1) = %false task(%thunderwood_selector).freq = 1 CONTROL SET TEXT hDlg,11," W" EXIT SUB 'ThunderWood is not allowed to play in whispermode! END IF IF votes.thunderwood(1) <> CurrentPiece THEN IF CurrentPiece = %WSB_CTRL_TUTTI THEN StopTask %wsb_tutti_task ELSEIF Votes.thunderwood(2) THEN StopTask %wsb_thunderwood_notes_task Votes.thunderwood(2) = %false END IF CurrentPiece = votes.Thunderwood(1) 'send message to klung server ProgChange %Thunderwood_channel, BYVAL CurrentPiece CONTROL SET TEXT hDlg,11, STR$(CurrentPiece) IF ISFALSE CurrentPiece THEN task(%thunderwood_selector).freq = 1 ELSE 'we wait 2' before we allow another piece to be played task(%ThunderWood_selector).freq =0.0083 '=1/120 END IF EXIT SUB END IF task(%thunderwood_selector).freq = 1 END SUB SUB Troms_Piece_Selector () STATIC Currentpiece AS LONG STATIC hDlg AS LONG IF WhisperMode THEN CurrentPiece = %false votes.troms(1) = %false task(%Troms_selector).freq = 1 CONTROL SET TEXT hDlg,21," W" EXIT SUB 'Troms is not allowed to play in whispermode! END IF IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg IF votes.troms(1) <> CurrentPiece THEN IF CurrentPiece = %WSB_CTRL_TUTTI THEN StopTask %wsb_tutti_task ELSEIF Votes.troms(2) THEN StopTask %wsb_troms_notes_task Votes.troms(2) = %false END IF CurrentPiece = votes.troms(1) 'send message to Troms server ProgChange %Troms_channel, BYVAL CurrentPiece CONTROL SET TEXT hDlg,21, STR$(currentPiece) IF ISFALSE CurrentPiece THEN task(%Troms_selector).freq = 1 ELSE 'we wait 2' before we allow another piece to be played task(%Troms_selector).freq =0.0083 '=1/120 END IF EXIT SUB END IF task(%klung_selector).freq = 1 END SUB SUB Springers_Piece_Selector () STATIC Currentpiece AS LONG STATIC hDlg AS LONG IF WhisperMode THEN ' CurrentPiece = %false ' votes.springers(1) = %false ' task(%Springers_selector).freq = 1 ' CONTROL SET TEXT hDlg,31," W" ' EXIT SUB 'Springers is not allowed to play in whispermode! END IF IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg IF votes.springers(1) <> CurrentPiece THEN IF CurrentPiece = %WSB_CTRL_TUTTI THEN StopTask %wsb_tutti_task ELSEIF Currentpiece = %WSB_CTRL_SPRIN_INDIV THEN 'Votes.springers(2) THEN ' MSGBOX "stop notes" + STR$(currentpiece) + STR$(votes.springers(1)) StopTask %wsb_springers_notes_task Votes.klung(2) = %false END IF CurrentPiece = votes.springers(1) 'send message to klung server ProgChange %Springers_channel, BYVAL CurrentPiece CONTROL SET TEXT hDlg, 31, STR$(CurrentPiece) 'reschedule task IF ISFALSE CurrentPiece THEN task(%Springers_selector).freq = 1 ELSE 'we wait 2' before we allow another piece to be played task(%Springers_selector).freq =0.0083 '=1/120 END IF EXIT SUB END IF task(%Springers_selector).freq = 1 END SUB FUNCTION ReturnHandlerDlg AS LONG 'returns handle of status window. creates it on first call STATIC hDlg AS LONG LOCAL tekst AS STRING LOCAL i AS LONG IF ISFALSE hDlg THEN 'FOR i = 0 TO 31 ' tekst=STR$(votes.klung(i)) ' MSGBOX tekst 'NEXT DIALOG NEW %HWND_DESKTOP,"WSB Status",1,1,250,360 TO hDlg CONTROL ADD FRAME, hDlg, -1, "Klung",5,5,240,50 CONTROL ADD LABEL, hDlg,-1,"Current piece:",10,20,50,10 CONTROL ADD LABEL, hDlg, 1,"-",60,19,30,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Velo:",10,35,20,10 tekst = HEX$(votes.klung(%WSB_CTRL_VELO)) 'STR$(KlungHandler(%WSB_RETURN_VELO)) CONTROL ADD LABEL, hDlg,2,tekst,30,35,20,10, %SS_SUNKEN ' MSGBOX tekst + STR$(%WSB_CTRL_VELO) + STR$(votes.klung(%WSB_CTRL_VELO)) CONTROL ADD LABEL, hDlg, -1,"Speed:",85,35,27,10 tekst = HEX$(votes.klung(%WSB_CTRL_SPEED)) 'STR$(KlungHandler(%WSB_RETURN_SPEED)) CONTROL ADD LABEL, hDlg, 3, tekst, 112,35,20,10,%SS_SUNKEN CONTROL ADD LABEL, hDlg,-1,"Density:",160,35,30,10 tekst = HEX$(votes.klung(%WSB_CTRL_DENS)) 'STR$(KlungHandler(%WSB_RETURN_DENSITY)) CONTROL ADD LABEL, hDlg,4, tekst,190,35,20,10, %SS_SUNKEN 'DEBUG ' CONTROL ADD LABEL, hDlg, 5,"",100,20,50,10, %SS_SUNKEN '/DEBUG CONTROL ADD FRAME, hDlg, -1, "ThunderWood",5,65,240,50 CONTROL ADD LABEL, hDlg,-1,"Current piece:",10,80,50,10 CONTROL ADD LABEL, hDlg, 11,"-",60,79,30,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Velo:",10,95,20,10 tekst = STR$(ThunderWoodHandler(%WSB_RETURN_VELO)) CONTROL ADD LABEL, hDlg,12,tekst,30,95,20,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Speed:",85,95,27,10 tekst = STR$(ThunderWoodHandler(%WSB_RETURN_SPEED)) CONTROL ADD LABEL, hDlg, 13, tekst, 112,95,20,10,%SS_SUNKEN CONTROL ADD LABEL, hDlg,-1,"Density:",160,95,30,10 tekst = STR$(ThunderWoodHandler(%WSB_RETURN_DENSITY)) CONTROL ADD LABEL, hDlg,14, tekst,190,95,20,10, %SS_SUNKEN CONTROL ADD FRAME, hDlg, -1, "Troms",5,125,240,50 CONTROL ADD LABEL, hDlg,-1,"Current piece:",10,140,50,10 CONTROL ADD LABEL, hDlg, 21,"-",60,139,30,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Velo:",10,155,20,10 tekst = STR$(TromsHandler(%WSB_RETURN_VELO)) CONTROL ADD LABEL, hDlg,22,tekst,30,155,20,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Speed:",85,155,27,10 tekst = STR$(TromsHandler(%WSB_RETURN_SPEED)) CONTROL ADD LABEL, hDlg, 23, tekst, 112,155,20,10,%SS_SUNKEN CONTROL ADD LABEL, hDlg,-1,"Density:",160,155,30,10 tekst = STR$(TromsHandler(%WSB_RETURN_DENSITY)) CONTROL ADD LABEL, hDlg,24, tekst,190,155,20,10, %SS_SUNKEN CONTROL ADD FRAME, hDlg, -1, "Springers",5,185,240,50 CONTROL ADD LABEL, hDlg,-1,"Current piece:",10,200,50,10 CONTROL ADD LABEL, hDlg, 31,"-",60,199,30,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Velo:",10,215,20,10 tekst = STR$(SpringersHandler(%WSB_RETURN_VELO)) CONTROL ADD LABEL, hDlg,32,tekst,30,215,20,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg, -1,"Speed:",85,215,27,10 tekst = STR$(SpringersHandler(%WSB_RETURN_SPEED)) CONTROL ADD LABEL, hDlg, 33, tekst, 112,215,20,10,%SS_SUNKEN CONTROL ADD LABEL, hDlg,-1,"Density:",160,215,30,10 tekst = STR$(SpringersHandler(%WSB_RETURN_DENSITY)) CONTROL ADD LABEL, hDlg,34, tekst,190,215,20,10, %SS_SUNKEN CONTROL ADD FRAME, hDlg,-1, "Real-Time",5,245,240,50 CONTROL ADD LABEL, hDlg, -1,"Intranet:",10,260,30,10 CONTROL ADD LABEL, hDlg,100,"-", 40,259,40,10, %SS_SUNKEN CONTROL ADD LABEL, hDlg,-1,"Internet:",85,260,29,10 CONTROL ADD LABEL, hDlg,101,"-",114,259,25,10, %SS_SUNKEN CONTROL ADD FRAME, hDlg, -1,"Ftp-status:",5,305,240,50 CONTROL ADD TEXTBOX, hDlg, 200,"...",10, 320,230,30, %ES_AUTOVSCROLL OR %ES_MULTILINE OR %ES_WANTRETURN DIALOG SHOW MODELESS hDlg END IF FUNCTION = hDlg END FUNCTION SUB Wsb_StatusWindow () STATIC hDlg AS LONG STATIC i AS LONG LOCAL tekst AS STRING IF ISFALSE hDlg THEN hDlg = ReturnHandlerDlg 'we update different labels alternating to prevent creating bottlenecks 'EXIT SUB INCR i SELECT CASE i CASE 1 tekst = STR$(votes.klung(%WSB_CTRL_VELO)) 'STR$(KlungHandler(%WSB_RETURN_VELO)) CONTROL SET TEXT hDlg, 2, tekst tekst = STR$(votes.klung(%WSB_CTRL_SPEED)) 'STR$(KlungHandler(%WSB_RETURN_SPEED)) CONTROL SET TEXT hDlg, 3, tekst tekst = STR$(votes.klung(%WSB_CTRL_DENS)) 'STR$(KlungHandler(%WSB_RETURN_DENSITY)) CONTROL SET TEXT hdlg, 4, tekst CONTROL SET TEXT hDlg, 5, STR$(task(%klung_selector).freq) CASE 2 tekst = STR$(votes.thunderwood(%WSB_CTRL_VELO)) 'STR$(KlungHandler(%WSB_RETURN_VELO)) CONTROL SET TEXT hDlg, 12, tekst tekst = STR$(votes.thunderwood(%WSB_CTRL_SPEED)) 'STR$(KlungHandler(%WSB_RETURN_SPEED)) CONTROL SET TEXT hDlg, 13, tekst tekst = STR$(votes.thunderwood(%WSB_CTRL_DENS)) 'STR$(KlungHandler(%WSB_RETURN_DENSITY)) CONTROL SET TEXT hdlg, 14, tekst CASE 3 tekst = STR$(votes.troms(%WSB_CTRL_VELO)) 'STR$(KlungHandler(%WSB_RETURN_VELO)) CONTROL SET TEXT hDlg, 22, tekst tekst = STR$(votes.troms(%WSB_CTRL_SPEED)) 'STR$(KlungHandler(%WSB_RETURN_SPEED)) CONTROL SET TEXT hDlg, 23, tekst tekst = STR$(votes.troms(%WSB_CTRL_DENS)) 'STR$(KlungHandler(%WSB_RETURN_DENSITY)) CONTROL SET TEXT hdlg, 24, tekst CASE 4 tekst = STR$(votes.springers(%WSB_CTRL_VELO)) 'STR$(KlungHandler(%WSB_RETURN_VELO)) CONTROL SET TEXT hDlg, 32, tekst tekst = STR$(votes.springers(%WSB_CTRL_SPEED)) 'STR$(KlungHandler(%WSB_RETURN_SPEED)) CONTROL SET TEXT hDlg, 33, tekst tekst = STR$(votes.springers(%WSB_CTRL_DENS)) 'STR$(KlungHandler(%WSB_RETURN_DENSITY)) CONTROL SET TEXT hdlg, 34, tekst i = 0 CASE ELSE i = 0 END SELECT END SUB SUB Wsb_Tutti_Task () ' piece for all 18.09.2000 ' This is %WSB_CTRL_TUTTI ' the task number is %Wsb_tutti_task ' this piece can be interrupted and restarted any time. It will restart where it left off... ' it has only the parameters speed and velocity, for each instruments. ' These parameters should come from user input. ' algo notes: ' 7bit for i makes 128 combinations, a 4 per second, this means that the pattern rotates every 32 seconds ' 16bit for i makes 65536 combinations, what would mean the first rotation only occurs after 4h30" ... ' so, we better user separate bit counters here... STATIC i AS DWORD 'pattern bytes 32 bits AS QUAD for 64 bits binary pattern STATIC k AS BYTE STATIC m AS BYTE STATIC q AS BYTE STATIC j AS BYTE ' rotators STATIC l AS BYTE STATIC n AS BYTE STATIC r AS BYTE STATIC kln AS BYTE ' for klung notes pattern ' so we have couples: patternbyte,rotationcounter ' i,j ' k,l ' m,n ' q,r LOCAL Klung_level AS BYTE LOCAL Troms_level AS BYTE LOCAL Thunderwood_level AS BYTE LOCAL Springers_level AS BYTE LOCAL ib AS INTEGER LOCAL dummy AS LONG IF ISFALSE Task(%wsb_tutti_task).tog THEN 'App.Tempo = 60 ' not needed since we have a callback for this Task(%wsb_tutti_task).tog = %true ' slider... Slider(0).value = 60 SendMessage Slider(0).h, %TBM_SETPOS,%True, Slider(0).value SetDlgItemText gh.Cockpit, %GMT_TITLE , "" SetDlgItemText gh.Cockpit, %GMT_AUTHOR , $gwr kln = 32 END IF ' parameters: levels, from global params in interacivity. ' speed: change this tasks's frequency. ' here starts the playing algorithm: IF ISFALSE WhisperMode THEN Troms_level = (Votes.Troms(%WSB_CTRL_VELO) \ Votes.Troms(0)) * 127 Springers_level = (Votes.Springers(%WSB_CTRL_VELO) \ Votes.springers(0)) * 127 Klung_level = (Votes.Klung(%WSB_CTRL_VELO) \ Votes.klung(0)) * 127 ThunderWood_level = (Votes.ThunderWood(%WSB_CTRL_VELO) \ Votes.Thunderwood(0)) * 127 ELSE Troms_level = (Votes.Troms(%WSB_CTRL_VELO) \ Votes.Troms(0)) * 15 'waarden nog empirisch te tsten... Springers_level = (Votes.Springers(%WSB_CTRL_VELO) \ Votes.springers(0)) * 40 Klung_level = (Votes.Klung(%WSB_CTRL_VELO) \ Votes.klung(0)) * 10 ThunderWood_level = (Votes.ThunderWood(%WSB_CTRL_VELO) \ Votes.Thunderwood(0)) * 15 IF Troms_Level < 4 THEN Troms_Level = 4 IF Klung_Level < 3 THEN Klung_Level = 3 IF Thunderwood_Level < 5 THEN Thunderwood_Level = 5 END IF ' TROMS: ROTATE LEFT i,j ib = 0 FOR dummy = 24 TO 29 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 6 IF BIT (i,0) THEN Play %Troms_Channel, 24, ib 'Troms_level 'bastrom ib = 0 FOR dummy = 30 TO 33 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 4 IF BIT (i,1) THEN Play %Troms_Channel, 30, ib 'Troms_level 'tenor ib = 0 FOR dummy = 34 TO 37 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 4 IF BIT (i,2) THEN Play %Troms_Channel, 34, ib 'Troms_level 'altotrom ib = 0 FOR dummy = 38 TO 40 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 3 IF BIT (i,3) THEN Play %Troms_Channel, 38, ib 'Troms_level 'lowbongo ib = 0 FOR dummy = 41 TO 43 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 3 IF BIT (i,4) THEN Play %Troms_Channel, 41, ib 'Troms_level 'highbongo ib = 0 FOR dummy = 44 TO 45 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 2 IF BIT (i,5) THEN Play %Troms_Channel, 44, ib 'Troms_level 'lowminibongo ib = 0 FOR dummy = 46 TO 47 ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel, dummy, 1)) ' this is the velo value NEXT ib = ib \ 2 IF BIT (i,6) THEN Play %Troms_Channel, 46, ib 'Troms_Level 'highminibongo ROTATE RIGHT i,j IF i < 128 THEN INCR i ELSE i= %False INCR j END IF IF j > 7 THEN j = 0 ' KLUNG ROTATE LEFT k,l ' notes have to change here... (pattern to be checked for aesthetics...) ib = ASC(MID$(Task(%wsb_listen).Har.vel, Gray(kln), 1)) ' this is the velo value IF BIT (k,0) THEN Play %Klung_Channel, Gray(kln), ib 'klung_level ib = ib + ASC(MID$(Task(%wsb_listen).Har.vel,Gray(kln) + 2 + BIT(i,2) , 1)) ' this is the velo value IF BIT (k,1) THEN Play %Klung_Channel, Gray(kln) + 2 + BIT(i,2) , ib 'klung_level ib = ASC(MID$(Task(%wsb_listen).Har.vel, Gray(kln) + 5 - BIT(i,1), 1)) ' this is the velo value IF BIT (k,2) THEN Play %Klung_Channel, Gray(kln) + 5 - BIT(i,1), ib 'klung_level IF Gray(kln)+5 - BIT(i,1) <> Gray(kln) + 6 - BIT(i,0) THEN ib = ASC(MID$(Task(%wsb_listen).Har.vel, Gray(kln) + 6 - BIT(i,0), 1)) ' this is the velo value IF BIT (k,3) THEN Play %Klung_Channel, Gray(kln) + 6 - BIT(i,0), ib 'klung_level END IF INCR kln IF kln > 47 THEN kln = 32 ROTATE RIGHT k,l IF k < 16 THEN INCR k ELSE k = %False INCR l END IF IF l > 3 THEN l = 0 ' thunderwood: ROTATE LEFT m,n ib = ASC(MID$(Task(%wsb_listen).Har.vel, 1, 1)) ' this is the velo value IF BIT (m,0) THEN Play %ThunderWood_Channel, 1, ib ' ThunderWood_level ' bassblock ib = ASC(MID$(Task(%wsb_listen).Har.vel, 6, 1)) ' this is the velo value IF BIT (m,1) THEN Play %ThunderWood_Channel, 6, ib 'Thunderwood_level ' tenorblock ib = ASC(MID$(Task(%wsb_listen).Har.vel, 10, 1)) ' this is the velo value IF BIT (m,2) THEN Play %ThunderWood_Channel, 10, ib 'thunderwood_level ' altoblock ib = ASC(MID$(Task(%wsb_listen).Har.vel, 13, 1)) ' this is the velo value IF BIT (m,3) THEN Play %ThunderWood_Channel, 13, ib 'thunderwood_level ' high block ib = ASC(MID$(Task(%wsb_listen).Har.vel, 15, 1)) ' this is the velo value IF BIT (m,4) THEN Play %ThunderWood_Channel, 15, ib 'Thunderwood_level ' ratchet ib = ASC(MID$(Task(%wsb_listen).Har.vel, 17, 1)) ' this is the velo value IF BIT (m,5) THEN Play %ThunderWood_Channel, 17, ib 'thunderwood_level ' chimes ib = ASC(MID$(Task(%wsb_listen).Har.vel, 19, 1)) ' this is the velo value IF BIT (m,6) THEN Play %ThunderWood_Channel, 19, ib 'thunderwood_level ' thundersheet ROTATE RIGHT m,n IF m < 128 THEN INCR m ELSE m= %False INCR n END IF IF n > 7 THEN n = 0 ' SPRINGERS ROTATE LEFT q,r ib = ASC(MID$(Task(%wsb_listen).Har.vel, 124, 1)) ' this is the velo value IF BIT (q,0) THEN Play %Springers_Channel,124, ib 'springers_level ' shaker 1 ib = ASC(MID$(Task(%wsb_listen).Har.vel, 126, 1)) ' this is the velo value IF BIT (q,1) THEN Play %Springers_Channel,126, ib 'springers_level ' shaker 2 ib = ASC(MID$(Task(%wsb_listen).Har.vel, 120, 1)) ' this is the velo value IF BIT (q,2) THEN Play %Springers_Channel,120, ib 'springers_level ' spring 1 ib = ASC(MID$(Task(%wsb_listen).Har.vel, 121, 1)) ' this is the velo value IF BIT (q,3) THEN Play %Springers_Channel,121, ib 'springers_level ' spring 2 ib = ASC(MID$(Task(%wsb_listen).Har.vel, 122, 1)) ' this is the velo value IF BIT (q,4) THEN Play %Springers_Channel,122, ib 'springers_level ' spring 3 ib = ASC(MID$(Task(%wsb_listen).Har.vel, 123, 1)) ' this is the velo value IF BIT (q,5) THEN Play %Springers_Channel,123, ib 'springers_level ' spring 4 ROTATE RIGHT q,r IF q < 64 THEN INCR q ELSE q = %False INCR r END IF IF r > 5 THEN r = 0 Task(%wsb_tutti_task).freq = Slider(0).value * 4 / 60! ' MM240, of zestienden in MM60 END SUB SUB Stoch_server () STATIC hDlg AS LONG IF ISFALSE task(%stoch).tog THEN task(%stoch).tog = %true hDlg = Stoch_window END IF END SUB FUNCTION Stoch_Window AS LONG STATIC hDlg AS LONG IF hDlg THEN FUNCTION = hDlg: EXIT FUNCTION DIALOG NEW %HWND_DESKTOP,"Stoch server window", , ,300, 200 TO hDlg CONTROL ADD FRAME, hDlg, -1,"Klung",3,3,94,194 CONTROL ADD BUTTON, hDlg, 1, "Start",6, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 2, "Stop", 50, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 3, "AME +",6,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 4, "AME -",50,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 5, "VELO +",6, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 6, "VELO -", 50, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 7, "SPEED +",6, 64, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 8, "SPEED -", 50, 64, 40, 12 CALL cbStoch CONTROL ADD LABEL, hDlg , -1,"ame:",6,84,40,12 CONTROL ADD TEXTBOX, hDlg, 101,"1", 50, 84,40,12 CONTROL ADD LABEL, hDlg, -1, "velo:",6,98,40,12 CONTROL ADD TEXTBOX, hDlg, 102,"1",50,98,40,12 CONTROL ADD LABEL, hDlg, -1, "speed:",6,112,40,12 CONTROL ADD TEXTBOX, hDlg, 103, "1",50, 112, 40, 12 CONTROL ADD BUTTON, hDlg, 9, "update",6 ,128, 40, 12 CALL cbStoch CONTROL ADD FRAME, hDlg, -1,"Thunderwood",103,3,94,194 CONTROL ADD BUTTON, hDlg, 11, "Start",106, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 12, "Stop", 150, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 13, "AME +",106,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 14, "AME -",150,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 15, "VELO +",106, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 16, "VELO -", 150, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 17, "SPEED +",106, 64, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 18, "SPEED -", 150, 64, 40, 12 CALL cbStoch CONTROL ADD LABEL, hDlg , -1,"ame:",106,84,40,12 CONTROL ADD TEXTBOX, hDlg, 111,"1", 150, 84,40,12 CONTROL ADD LABEL, hDlg, -1, "velo:",106,98,40,12 CONTROL ADD TEXTBOX, hDlg, 112,"1",150,98,40,12 CONTROL ADD LABEL, hDlg, -1, "speed:",106,112,40,12 CONTROL ADD TEXTBOX, hDlg, 113, "1",150, 112, 40, 12 CONTROL ADD BUTTON, hDlg, 19, "update",106 ,128, 40, 12 CALL cbStoch CONTROL ADD FRAME, hDlg, -1, "Troms",203,3,94,194 CONTROL ADD BUTTON, hDlg, 21, "Start",206, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 22, "Stop", 250, 16, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 23, "AME +",206,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 24, "AME -",250,36,40,12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 25, "VELO +",206, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 26, "VELO -", 250, 50, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hDlg, 27, "SPEED +",206, 64, 40, 12 CALL cbStoch CONTROL ADD BUTTON, hdlg, 28, "SPEED -", 250, 64, 40, 12 CALL cbStoch CONTROL ADD LABEL, hDlg , -1,"ame:",206,84,40,12 CONTROL ADD TEXTBOX, hDlg, 121,"1", 250, 84,40,12 CONTROL ADD LABEL, hDlg, -1, "velo:",206,98,40,12 CONTROL ADD TEXTBOX, hDlg, 122,"1",250,98,40,12 CONTROL ADD LABEL, hDlg, -1, "speed:",206,112,40,12 CONTROL ADD TEXTBOX, hDlg, 123, "1",250, 112, 40, 12 CONTROL ADD BUTTON, hDlg, 29, "update",206 ,128, 40, 12 CALL cbStoch DIALOG SHOW MODELESS hDlg FUNCTION = hDlg END FUNCTION CALLBACK FUNCTION cbStoch STATIC ame_klung AS BYTE STATIC velo_klung AS BYTE STATIC speed_klung AS BYTE STATIC ame_tw AS BYTE STATIC velo_tw AS BYTE STATIC speed_tw AS BYTE STATIC ame_trom AS BYTE STATIC velo_trom AS BYTE STATIC speed_trom AS BYTE LOCAL buf$ IF ISFALSE ame_klung THEN ame_klung= 1 IF ISFALSE velo_klung THEN velo_klung = 1 IF ISFALSE speed_klung THEN speed_klung = 1 IF ISFALSE ame_tw THEN ame_tw = 1 IF ISFALSE velo_tw THEN velo_tw = 1 IF ISFALSE speed_tw THEN speed_tw = 1 IF ISFALSE ame_trom THEN ame_trom = 1 IF ISFALSE speed_trom THEN speed_trom = 1 IF ISFALSE velo_trom THEN velo_trom = 1 IF CBCTLMSG <> %BN_CLICKED THEN EXIT FUNCTION SELECT CASE CBCTL CASE 1 'start stochlung ProgChange %klung_channel, 21 ModeMess %Klung_Channel, %WSB_CTRL_DENS, ame_klung ModeMess %Klung_Channel, %WSB_CTRL_SPEED, speed_klung ModeMess %Klung_Channel, %WSB_CTRL_VELO, velo_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 ' MSGBOX "on" CASE 2 ProgChange %klung_channel, 0 Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 3 ' INCR ame_klung ame_klung = ame_klung + 5 IF ame_klung > 127 THEN ame_klung = 127 CONTROL SET TEXT CBHNDL, 101, STR$(ame_klung) ModeMess %Klung_Channel, %WSB_CTRL_DENS, ame_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 4 ' DECR ame_klung ame_klung = ame_klung - 5 IF ame_klung < 1 THEN ame_klung = 1 CONTROL SET TEXT CBHNDL, 101, STR$(ame_klung) ModeMess %Klung_Channel, %WSB_CTRL_DENS, ame_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 5 ' INCR velo_klung velo_klung = velo_klung + 5 IF velo_klung > 127 THEN velo_klung = 127 CONTROL SET TEXT CBHNDL, 102, STR$(velo_klung) ModeMess %Klung_Channel, %WSB_CTRL_VELO, velo_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 6 ' DECR velo_klung velo_klung = velo_klung - 5 IF velo_klung < 1 THEN velo_klung = 1 CONTROL SET TEXT CBHNDL, 102, STR$(velo_klung) ModeMess %Klung_Channel, %WSB_CTRL_VELO, velo_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 7 ' INCR speed_klung speed_klung = speed_klung + 5 IF speed_klung > 127 THEN speed_klung =127 CONTROL SET TEXT CBHNDL, 103, STR$(speed_klung) ModeMess %klung_channel, %WSB_CTRL_SPEED, speed_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 8 ' DECR speed_klung speed_klung = speed_klung - 5 IF speed_klung < 1 THEN speed_klung =1 CONTROL SET TEXT CBHNDL, 103, STR$(speed_klung) ModeMess %klung_channel, %WSB_CTRL_SPEED, speed_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 9 CONTROL GET TEXT CBHNDL, 101 TO buf$ ame_klung = VAL(buf$) IF ame_klung > 127 THEN ame_klung = 127 IF ame_klung < 1 THEN ame_klung = 1 ModeMess %klung_channel, %WSB_CTRL_DENS, ame_klung CONTROL GET TEXT CBHNDL, 102 TO buf$ velo_klung = VAL(buf$) IF velo_klung > 127 THEN velo_klung = 127 IF velo_klung < 1 THEN velo_klung = 1 ModeMess %klung_channel, %WSB_CTRL_VELO, velo_klung CONTROL GET TEXT CBHNDL, 103 TO buf$ speed_klung = VAL(buf$) IF speed_klung > 127 THEN speed_klung = 127 IF speed_klung < 1 THEN speed_klung = 1 ModeMess %klung_channel, %WSB_CTRL_SPEED, speed_klung Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 11 'start thunderwood ProgChange %thunderwood_channel, 21 ModeMess %thunderwood_Channel, %WSB_CTRL_DENS, ame_tw ModeMess %thunderwood_Channel, %WSB_CTRL_SPEED, speed_tw ModeMess %thunderwood_Channel, %WSB_CTRL_VELO, velo_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 ' MSGBOX "on" CASE 12 ProgChange %thunderwood_channel, 0 Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 13 ' INCR ame_tw ame_tw = ame_tw + 5 IF ame_tw > 127 THEN ame_tw = 127 CONTROL SET TEXT CBHNDL, 111, STR$(ame_tw) ModeMess %thunderwood_Channel, %WSB_CTRL_DENS, ame_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 14 ' DECR ame_tw ame_tw = ame_tw - 5 IF ame_tw < 1 THEN ame_tw = 1 CONTROL SET TEXT CBHNDL, 111, STR$(ame_tw) ModeMess %Klung_Channel, %WSB_CTRL_DENS, ame_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 15 ' INCR velo_tw velo_tw = velo_tw + 5 IF velo_tw > 127 THEN velo_tw = 127 CONTROL SET TEXT CBHNDL, 112, STR$(velo_tw) ModeMess %thunderwood_Channel, %WSB_CTRL_VELO, velo_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 16 ' DECR velo_tw velo_tw = velo_tw - 5 IF velo_tw < 1 THEN velo_tw = 1 CONTROL SET TEXT CBHNDL, 112, STR$(velo_tw) ModeMess %thunderwood_Channel, %WSB_CTRL_VELO, velo_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 17 ' INCR speed_tw speed_tw = speed_tw + 5 IF speed_tw > 127 THEN speed_tw =127 CONTROL SET TEXT CBHNDL, 113, STR$(speed_tw) ModeMess %thunderwood_channel, %WSB_CTRL_SPEED, speed_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 18 ' DECR speed_tw speed_tw = speed_tw - 5 IF speed_tw < 1 THEN speed_tw =1 CONTROL SET TEXT CBHNDL, 113, STR$(speed_tw) ModeMess %thunderwood_channel, %WSB_CTRL_SPEED, speed_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 19 ' MSGBOX "twupdat" CONTROL GET TEXT CBHNDL, 111 TO buf$ ame_tw = VAL(buf$) IF ame_tw > 127 THEN ame_tw = 127 IF ame_tw < 1 THEN ame_tw = 1 ModeMess %thunderwood_channel, %WSB_CTRL_DENS, ame_tw CONTROL GET TEXT CBHNDL, 112 TO buf$ velo_tw = VAL(buf$) IF velo_tw > 127 THEN velo_tw = 127 IF velo_tw < 1 THEN velo_tw = 1 ModeMess %thunderwood_channel, %WSB_CTRL_VELO, velo_tw CONTROL GET TEXT CBHNDL, 113 TO buf$ speed_tw = VAL(buf$) IF speed_tw > 127 THEN speed_tw = 127 IF speed_tw < 1 THEN speed_tw = 1 ModeMess %thunderwood_channel, %WSB_CTRL_SPEED, speed_tw Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 21 'start stochlung ProgChange %troms_channel, 21 ModeMess %troms_Channel, %WSB_CTRL_DENS, ame_trom ModeMess %troms_Channel, %WSB_CTRL_SPEED, speed_trom ModeMess %troms_Channel, %WSB_CTRL_VELO, velo_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 ' MSGBOX "on" CASE 22 ProgChange %troms_channel, 0 Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 23 ' INCR ame_trom ame_trom = ame_trom + 5 IF ame_trom > 127 THEN ame_trom = 127 CONTROL SET TEXT CBHNDL, 121, STR$(ame_trom) ModeMess %troms_Channel, %WSB_CTRL_DENS, ame_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 24 ' DECR ame_trom ame_trom = ame_trom - 5 IF ame_klung < 1 THEN ame_klung = 1 CONTROL SET TEXT CBHNDL, 121, STR$(ame_trom) ModeMess %troms_Channel, %WSB_CTRL_DENS, ame_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 25 ' INCR velo_trom velo_trom = velo_trom + 5 IF velo_trom > 127 THEN velo_trom = 127 CONTROL SET TEXT CBHNDL, 122, STR$(velo_trom) ModeMess %troms_Channel, %WSB_CTRL_VELO, velo_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 26 ' DECR velo_trom velo_trom = velo_trom - 5 IF velo_trom < 1 THEN velo_trom = 1 CONTROL SET TEXT CBHNDL, 122, STR$(velo_trom) ModeMess %troms_Channel, %WSB_CTRL_VELO, velo_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 27 ' INCR speed_trom speed_trom = speed_trom + 5 IF speed_trom > 127 THEN speed_trom =127 CONTROL SET TEXT CBHNDL, 123, STR$(speed_trom) ModeMess %troms_channel, %WSB_CTRL_SPEED, speed_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 28 ' DECR speed_trom speed_trom = speed_trom - 5 IF speed_trom < 1 THEN speed_trom =1 CONTROL SET TEXT CBHNDL, 123, STR$(speed_trom) ModeMess %troms_channel, %WSB_CTRL_SPEED, speed_trom Play 14,100,0 Play 14,100,0 Play 14,100,0 CASE 29 CONTROL GET TEXT CBHNDL, 121 TO buf$ ame_trom = VAL(buf$) IF ame_trom > 127 THEN ame_trom = 127 IF ame_trom < 1 THEN ame_trom = 1 ModeMess %troms_channel, %WSB_CTRL_DENS, ame_trom CONTROL GET TEXT CBHNDL, 122 TO buf$ velo_trom = VAL(buf$) IF velo_trom > 127 THEN velo_trom = 127 IF velo_trom < 1 THEN velo_trom = 1 ModeMess %troms_channel, %WSB_CTRL_VELO, velo_trom CONTROL GET TEXT CBHNDL, 123 TO buf$ speed_trom = VAL(buf$) IF speed_trom > 127 THEN speed_trom = 127 IF speed_trom < 1 THEN speed_trom = 1 ModeMess %troms_channel, %WSB_CTRL_SPEED, speed_trom Play 14,100,0 ' fills buffer... Play 14,100,0 Play 14,100,0 END SELECT END FUNCTION '[EOF]