DECLARE SUB InitKristofPiece () DECLARE SUB Kristof () SUB InitKristofPiece '!!declareren wat midi-taken zijn zie globalharmony 'r1625 en verder in gmt bas >> global variabels veranderen in initialisatie 'PRINT "Kristof.Dat will be read now" 'DEBUG ReadPatternRecognitionDataFile "Kristof.dat" 'PRINT "Kristof.Dat read" 'DEBUG 'hier globals leeg maken LOCAL errorgetal AS LONG LOCAL Tasknr AS INTEGER Task(16).naam = "Commu" Task(16).switch = %False Task(16).channel = 0 Task(16).freq = 1000 Task(16).cptr = CODEPTR(Commu) Task(17).naam = "PlSamp" Task(17).switch = %False Task(17).Freq = .1 Task(17).cptr = CODEPTR (KPlaysample) Task(18).naam = "WrDat" Task(18).switch = %False Task(18).Freq = 10 Task(18).cptr = CODEPTR(wrdat) Task(19).naam ="ListBoxHandler" Task(19).switch = %False Task(19).freq = 10 Task(19).cptr = CODEPTR(ListBoxHandler) Task(21).naam = "Voice1" Task(21).switch = %False Task(21).channel = 1 ' input channel - normally set to 0 Task(21).level = 127 Task(21).freq = 1000 Task(21).cptr = CODEPTR(Voice1) Task(22).naam = "Voice2" Task(22).switch = %False Task(22).channel = 2 ' input channel - normally set to 0 Task(22).level = 127 Task(22).freq = 3 Task(22).cptr = CODEPTR(Voice2) Task(23).naam = "Voice3" Task(23).switch = %False Task(23).channel = 3 ' input channel - normally set to 0 Task(23).level = 127 Task(23).freq = 2.8 Task(23).cptr = CODEPTR(Voice3) Task(47).naam = "Harmonics" Task(47).switch = %False Task(47).freq = 40 Task(47).cptr = CODEPTR(Harmonics) ' Task(17).naam = "Sine1" ' Task(17).switch = %False ' Task(17).channel = 0 ' Task(17).pan = 0 ' Task(17).level = 0 'here: note ' Task(17).freq = 10 '' Task(17).cptr = CODEPTR(Sine1) ' Task(18).naam = "Sine2" ' Task(18).switch = %False ' Task(18).channel = 1 ' Task(18).pan = 127 ' Task(18).level = 0 'here: note ' Task(18).freq = 11 ' Task(18).cptr = CODEPTR(Sine2)'StopTask 15 'put globhar off FOR Tasknr = 16 TO 23 IF Task(Tasknr).switch = %True THEN StartTask Tasknr ELSE StopTask Tasknr END IF Errorgetal = SetDlgItemText (hCockpit,%GMT_TASK0_ID + Tasknr,BYCOPY Task(Tasknr).naam) ' PRINT errorgetal NEXT i '%Debugging = %NotFalse '!!globals hier weer invullen ' app.author="Kristof Lauwers" ' app.title="Test 1" ' CLS END SUB 'what follows is an attempt to make a listbox with the DLL compiler. 'as the dll compiler is not installed here,i do an attempt to do it with the winapi 'CALLBACK FUNCTION terugroepfunctie ' STATIC CtlMsg% ' CtlMsg = CBWPARAM ' IF CtlMsg = %lbn_dblclk THEN ' BEEP:BEEP:BEEP ' END IF 'END FUNCTION 'SUB ListTst ' STATIC tasknr AS INTEGER ' STATIC hDlg& ' STATIC msg&,wParam&,LParam& ' STATIC id& ' STATIC item$() ' IF ISFALSE tasknr THEN ' id& = 1 ' tasknr = 19 ' DIM item$ (0 TO 1) ' item$(0)= "item 0" ' item$(1) = "item 1" ' ' DIALOG NEW %HWND_DESKTOP,"ListTst",1,1,200,200 TO hDlg& ' 'DIALOG SEND hDlg&,msg&,wParam,lParam ' CONTROL ADD LISTBOX, hDlg&,id&,item$(),1,1,100,40, CALL terugroepfunctie ' DIALOG SHOW MODELESS hDlg& 'houdt rest niet tegen, vereist dialog doeevents ' END IF ' DIALOG DOEVENTS ' terugroepfunctie 'END SUB SUB Commu 'get input from outsdide STATIC tasknr AS INTEGER, oldnote AS INTEGER '?? als je een noot induwt > LOCAL nv AS INTEGER, note AS BYTE,vel AS BYTE,ch AS BYTE ' blijft aan, ook als je ze loslaat 'LOCAL nv%, note AS INTEGER, vel AS INTEGER ' w/ pas afgezet als je een andere IF ISFALSE tasknr THEN ' toets induwt > stilte tasknr = 16 ' als je dan opnieuw een toets oldnote = %False ' induwt klinkt een nieuwe noot ch = 0 END IF ' nv = GetOldMidiNote (ch,%True) 'keyboard send on channel 16 IF nv > -1 THEN note = HIBYT(nv):vel = LOBYT(nv) 'Play 0,note+1,vel ' PRINT ch;SPC(1);note;SPC(1);vel;SPC(4); END IF END SUB ' AddNote2Har Task(tasknr).har(0), BYCOPY note, BYCOPY vel 'hoe kan je weten welke noot ' ' "oudst" is ? ' ' om de tijd van de individuele noten bij te houden gebruik je ' best een afzonderlijke taak, bvb. met freq 10Hz a 100Hz ' In die taak vergelijk je Task(16).har(0).vel met de waarde in hetzelfde ' veld van die taak. ' dimensioneer STATIC Harduur AS HarmType ' Harduur.vel = STRING$(128,0) ' en gebruik de vel waarden voor duur bvb. 'FUNCTION CN2F! (noot!) 'opgenomen in harmlib ' CN2F! = (GrondDo * (2 ^ (noot! / 12!))) 'GrondDo is juist 'END FUNCTION 'FUNCTION F2CN! (f!) ' IF f! < 8 THEN F2CN! = 0: EXIT FUNCTION ' FUNCTION = (12 * (LOG(f!) - LOG(GrondDo)) / (LOG(2))) 'END FUNCTION 'FUNCTION CN2F!(N!) 'CentNote to Frequency ' LOCAL F! ' F! = 440 * 2^((69 - N!)/12) ' CN2F! = F! 'END FUNCTION 'FUNCTION F2CN!(F!) 'Frquency to centnote ' LOCAL N! ' N! = 69 + 12* LOG2(F!/440) 'doesn't work right !!!! ' F2CN! = N! 'END FUNCTION 'SUB Sine1 ' STATIC tasknr AS INTEGER ' LOCAL i! ' IF ISFALSE tasknr THEN ' tasknr = 17 ' ModeMess Task(tasknr).Channel,10,Task(tasknr).Pan ' FOR i! = 50 TO 70 STEP .7 ' PRINT i!,F2CN(CN2F(i!)) ' NEXT ' END IF 'END SUB 'SUB Sine2 ' STATIC tasknr AS INTEGER ' IF ISFALSE tasknr THEN ' tasknr = 18 ' ModeMess Task(tasknr).Channel,10,Task(tasknr).Pan ' END IF 'END SUB SUB Voice1 STATIC tasknr AS INTEGER STATIC Cnt AS INTEGER IF ISFALSE tasknr THEN tasknr = 21 ModeMess Task(tasknr).Channel,10,0 cnt = %Null END IF PlayHar Task(16).Har(0),Task(tasknr).Channel END SUB SUB Voice2 STATIC tasknr AS INTEGER STATIC note AS INTEGER IF ISFALSE tasknr THEN tasknr = 22 ModeMess Task(tasknr).Channel,10,127 note = 20 END IF DelNote2Har Task(tasknr).Har(0),BYCOPY note note = note+1 IF note > 100 THEN note = 21 'PRINT note, AddNote2Har Task(tasknr).Har(0),BYCOPY note,127 Playhar Task(tasknr).Har(0),Task(tasknr).channel END SUB SUB Voice3 STATIC tasknr AS INTEGER STATIC note AS INTEGER IF ISFALSE tasknr THEN tasknr = 23 ModeMess Task(tasknr).Channel,10,127 note = 20 END IF DelNote2Har Task(tasknr).Har(0),BYCOPY note note = note+1 IF note > 100 THEN note = 21 ' PRINT note, AddNote2Har Task(tasknr).Har(0),BYCOPY note,127 Playhar Task(tasknr).Har(0),Task(tasknr).channel END SUB SUB Harmonics STATIC tasknr AS INTEGER STATIC startfreq AS SINGLE STATIC i AS INTEGER STATIC filenr AS LONG IF ISFALSE tasknr THEN filenr = FREEFILE tasknr = 47 i=1 startfreq = NF2F!(21) OPEN "c:\Kristof\Harmonic.txt" FOR OUTPUT AS #filenr PRINT# filenr ,"dummy" PRINT# filenr ,"Number -> Midi Note Number" END IF PRINT# filenr, i,F2NF!(i*startfreq) i = i+1 IF i >= 1001 THEN StopTask tasknr tasknr = %false CLOSE #filenr END IF END SUB FUNCTION ListTst AS LONG ' STATIC tasknr AS INTEGER 'uiteindlijk geen taak !! STATIC element() AS STRING * 10 STATIC hEl() AS LONG LOCAL dummy AS LONG LOCAL msg AS tagMSG LOCAL WndClass AS WndClassEx LOCAL szClassName AS ASCIIZ * 10 LOCAL dwExStyle AS DWORD LOCAL i AS INTEGER 'IF ISFALSE tasknr THEN ' tasknr = 19 DIM element(0 TO 5) DIM hEl(0 TO 5) DIM hListWnd AS GLOBAL LONG 'END IF szClassName = "LISTBOX" ' ???? 'PRINT hInst 'PRINT szClassName hListWnd = CreateWindow(szClassName, _ ' window class name "testwindow", _ ' window caption %WS_OVERLAPPEDWINDOW OR %WS_VSCROLL OR %LBS_MULTIPLESEL, _ ' window style 1, _ ' initial x position 1, _ ' initial y position 200, _ ' initial x size 130, _ ' initial y size %HWND_DESKTOP, _ ' parent window handle %NULL, _ ' window menu handle hInst, _ ' program instance handle BYVAL %NULL) ' creation parameters FOR i = 0 TO 5 element(i) = "Item "+STR$(i) hEl(0) = SendMessage (hListWnd,%LB_ADDSTRING,i,VARPTR (element(i))) 'PRINT "hEl";hEl(0), 'gegeven nummer dummy = SendMessage (hListWnd,%LB_SETITEMDATA,i,i) 'PRINT "dummy"; dummy 'altijd1 ' Display the window on the screen NEXT ShowWindow hListWnd, %SW_SHOW UpdateWindow hListWnd 'stoptask tasknr FUNCTION =hListWnd END FUNCTION SUB ListBoxHandler STATIC tasknr AS INTEGER STATIC hWnd AS LONG LOCAL msg AS TAGmsg LOCAL retval& IF ISFALSE tasknr THEN tasknr = 19 hWnd = ListTst END IF retval& = PeekMessage (msg, hWnd,%Null,%Null,%PM_Remove) IF retval& <> %false THEN ' %WM_LBUTTONDOWN THEN 'PRINT Msg.wParam,Msg.lParam END IF END SUB SUB wrdat STATIC tasknr AS INTEGER LOCAL f AS INTEGER IF ISFALSE tasknr THEN tasknr = 18 END IF f = FREEFILE OPEN "Kristof.dat" FOR OUTPUT AS #f WRITE #f, "NROFSAMPLEFILES",3,"wave1.wav","wave2.wav","wave3.wav" 'WRITE #f, 0 'WRITE #f, 1 'WRITE #f, 1 'WRITE #f, "wave1.wav" CLOSE #f 'PRINT f stoptask tasknr END SUB SUB KPlaySample STATIC tasknr AS INTEGER IF ISFALSE tasknr THEN tasknr = 17 END IF 'DECLARE SUB PlayWaveFile (filnam AS ASCIIZ, flags AS WORD) ' callback for wave input sampler - tested O.K. ' this is the PlaySample END SUB