Processing #4 comments, questions, ... Started 99/04/27 0427 Embryonale versie met meer commentaar en een eerste poging om midi INPUT te doen IN Kristof.Bas IN konstant.bi moet %ID_KL_PROCESS4 ingeschreven worden !! >done ingeschreven IN gmt.rc: ID_KL_PROCESSING4, " by Kristof Lauwers" (r139) MENUITEM "Processing #4...", ID_KL_PROCESSING4 (r202) Compileren van gmt.rc lukt niet; vraag gemaild naar Godfried - 0503 niet aangekomen Gmt_stud is (voorlopig) zo aangepast dat IN the works nu naar processing#4 verwijst 0502 Process4.inc bevat TYPE Pro4 - een .bi file werkte hier niet >?? waar ligt het verschil ? Task engine moet later de precieze frequentie sturen - voorlopig leeg 0503 Sine1/2 zetten nu alleen nog noten aan / af zoals engine het opgeeft Engine laat de frequenties varieren de berekening van FreqChange moet aangepastw., zodat de frequenties binnen een bepaald bereik blijven (nu stijgen ze voortdurend!) > solved by giving other startfreq 0504 taak harmonic maakt een file c:\kristof\harmonic.txt, die de eerste 1000 tonen van de boventoonreekse op midi noot 21 geeft (als MidiCentNote) (heeft voor de rest niets te maken met processing #4 - just FOR fun) 0510 CN2F! = IN harmlib NF2F% >> aanpassen !! Done 0518 Engine geeft nu alleen een nieuwe noot als de vorige gespeeld is geweest (Pro4.NoteToPutOn(task)=0) 0519 FUNCTION GetFChange (i%,j%) geeft de verandering van Pro4.Freq(i%) die voortkomt uit de relatie met j% >> optellen voor verschillende j%'s >nu gemiddelde j%,i% geeft de tegengestelde waarde !!nog verder te debuggen : DoesItWhatItHasToDo?, !! stabliiseert te vlug >>Volgende kode kon nu gewist worden (uit engine): ' IF Pro4.Freq(16) < Pro4.Freq(17) THEN ' Pro4.FreqChange(16) =- Pro4.FreqChange(tasknr) '+ Pro4.FreqChange(16) ' Pro4.FreqChange(17) = Pro4.FreqChange(tasknr) '+ Pro4.FreqChange(17) ' ELSE ' Pro4.FreqChange(16) = Pro4.FreqChange(tasknr) '+ Pro4.FreqChange(16) ' Pro4.FreqChange(17) = -Pro4.FreqChange(tasknr) '+ Pro4.FreqChange(17) ' END IF ' Pro4.Dif(16,17) = ABS(Pro4.Freq(16) - Pro4.Freq(17)) 'verschil tss. 16&17 - w.n. gespeeld ' Pro4.Dif(16,18) = ABS(Pro4.Freq(16) - Pro4.Freq(18)) ' Pro4.Dif(17,18) = ABS(Pro4.Freq(17) - Pro4.Freq(18)) Pro4.Klap > omklappen van negatieve deel van ^2-curve gebruikt bij GetFChange Laten veranderen tijdens het stuk 0521 P_engine = vroegere engine >> berekent pitches R_engine : nieuw; berekent Task().Frq voor sine 1 - 3 << verschil v/d 2 somfreq waar een stem invloed op heeft berekent alleen nieuwe freq als e stem pas e noot heeft gespeeld zet bij de start alle andere taken aan >> werkt, maar alle stemmen gaan naar 1 v/d uitersten en blijven daar 0525 Debugroutine gemaakt(doet 32000 cycles aan 110 cycles/s; schrijft 3 bestanden:Taskfrequency's, notefrequency's, and notefrequencychange's !! conclusie : notefrequency's zijn gestabiliseerd in cycle 13881 taskfrequency's " " " " 10591 >>destabiliseren < attack IN synth edit MENU wordt gemoduleerd > door opgegeen controller > mag n 0 z 0527 geen sysx nodig , maar ModeMess >> controller instellen IN synth (master en edit-MENU) A_engine ingevuld <Done 0601 attack IN debugger >> crasht altijd oplossing (i/d les) 'windowscode voor file open [? var} filehandle = OpenFile ([naam$], buffer, %OF_PROMPT OR %OF_EXIST) ' OpenFile() Flags mogelijke constanten: uit winapi32.inc %OF_READ = &H0 %OF_WRITE = &H1 %OF_READWRITE = &H2 %OF_SHARE_COMPAT = &H0 %OF_SHARE_EXCLUSIVE = &H10 %OF_SHARE_DENY_WRITE = &H20 %OF_SHARE_DENY_READ = &H30 %OF_SHARE_DENY_NONE = &H40 %OF_PARSE = &H100 %OF_DELETE = &H200 %OF_VERIFY = &H400 %OF_CANCEL = &H800 %OF_CREATE = &H1000 %OF_PROMPT = &H2000 %OF_EXIST = &H4000 %OF_REOPEN = &H8000 >>TO Do!!!! 0602 Werkt nog niet; welk filenr gebruiken >> gemaild naar Godfried !!! Kristof.bas now available for experimental code (cfr startmenu) 0715 GetFchange helemaal vernieuwd >> Debugresultaten sine 1 en 2 lijken O.K. maar 3:- gedraagt zich eerst goed - maakt dan gigantische sprong naar boven >> doet denken aan divide-by-zero-toestanden ... werkt nu, de stemmen komen tesamen en gaan dan iets uiteen, maar het geheel stijgt voortdurend >> iets opvinden ! dit kom doordat: Dif = MIN -> change = maxchange ! 0716 P_engineII toegevoegd > frequencychange << sumFreq vrij analoog a/ P_engine, maar andere reactie op overschrijden van min. / max.- waarden (houd dan geen rekening meer met de berekende maximum change) (CHECK this: ook niet meer nodig om teken om te keren voor kleinste v/d 2) >true lijkt goed te werken Debugger nog aan passen aan nieuwe situatie comment bij GetFchangeD: 'freqchange is afhankelijk van e max, min, en streefwaarde 'op streefwaarde -> change = 0 'op Min, Max -> change = 1 * MaxFreqChange 'lineaire curve (versch. voor < of > MidDif !!) verheven tot macht DifChangeSpeed ' uiteindelijk : gemiddelde waarde van de 2 waarden voortkomend uit 2 relaties v. stemmen extra bij GetFchangeS 'IF Pro4.Freq(i) < Pro4.Freq(j) THEN First = - First 'n.v.t. hier omdat het over een som gaat !!??? Think About It >>true 'verhogen/lagen v. 1v/d waarden h. altijd zelfde effect op uitkomst 0717 R_Engine herschreven (en GetNewFreq) Task.Freq v/ SIN x volgt cosinuscurve (voor iedere taak verschillende snelheid) >>amplitudes van de cosinus laten wijzigen volgens INPUT >>ev. idem voor macht waartoe cosinus verheven is (oude ver. van GetNewFreq was: ' LOCAL Frq AS SINGLE,j AS INTEGER, k AS INTEGER ' ' SELECT CASE i ' CASE 16 ' j=17: k=18 ' CASE 17 ' j=16: k = 18 ' CASE 18 ' j=16: k=17 ' END SELECT ' Pro4.Sum(i,j)= Pro4.Freq(i)+Pro4.Freq(j) ' Pro4.Sum(i,k)= Pro4.Freq(i)+Pro4.Freq(k) ' Frq = Task(i).Freq*((COS(SQR(ABS(F2CN!(BYCOPY Pro4.Sum(i,j))-F2CN!(BYCOPY Pro4.Sum(i,k)))*3)*Pi)+1)*9/40 + 0.8) ' IF Frq < Pro4.MinFr THEN ' FUNCTION = Pro4.MinFr ' EXIT FUNCTION ' END IF ' IF Frq > Pro4.MaxFr THEN ' FUNCTION = Pro4.MaxFr ' EXIT FUNCTION ' END IF ' FUNCTION = Frq comment bij huidige versie: 'sinusoide met veranderbare amplitude '1+, /2 in formule is om sinuscurve te normalizeren op 0 ->1 'eventueel nog macht toevoegen voor versnelling ->done - voorlopic Ct '4+i: was 20, nu z. de sinussen in de 3 stemmen n meer even vlug 0719 Er zijn nu sliders bij P_Engine I om MIN/Mid/MaxDif te wijzigen MIN en MAX worden aangepast als Mid resp kleiner OF groter zou zijn. sliders voor MAX worden nu logarytmisch gemapt de voorstelling op de slidebar is als midicentnote wordt daarna voor P_engine omgerekend tot Freq. IN Pro4.Min/mid/max... opm. MAX,...Dif kunnen nu eigenlijk integers worden >>TO DO 0720 Nu ook sliders voor dif/SumChangeSpeed(=macht IN formules), values van 1 tot 40 mapping: (40-X)/10 -> klopt Ook sliders voor MAX amp van Task.Freq Rhytmengine moet nu ook geinitialiseerd worden (voor sliders) en kan dus andere taken niet meer aanzetten -> alle taken worden geinitialiseerd en zetten zichzelf af na eerste CALL nieuwe SUB P4_begin om alle taken weer aan te zetten Things TO DO: - Mapping van ChangeSpeed ken ev. nog verbeterd worden >>?? - sliders voor attack om uit te proberen >Done 0721 (nationale rouwdag) Attack_engine opnieuw IN werking !!! structuur met streefwaarde werkt niet WAAROM???? voorlopig uitgeremd werkt nu goed zonder RetVal start 2e poging >> RetVal werkt nu!! opm. - nog iets doen aan veelvoudig gebruik v Functions MIN/maxatt >>TO DO - Dummys om win98 invalid PAGE te vermijden uiteindelijk verwijderen >done - ?? met #IF extra taak plaatsen voor geval ERROR ?? >done 0722 SUB Waveform > leest waarde van sliders, deze wordt door sine x gemapt en als ctrl3 gezonden naar Proteus II, waar deze controller sec INSTR vol bepaalt 0801 SUB Osc_1 oscillator die later moet gemapt worden op variabelen IN andere subs de Task.Freq wordt berekend door GetOscFreq voorlopig 100 steps / cycle >> eventueel door slider instelbaar maken Frequency via slider; >> TO DO: mapping eens goed beredeneren !!!!!!!!!!!! done Value gedisplayd via slider (voorlopif) virtual keyboard is blijkbaar niet meer bruikbaar IN Gmt 0802 Osc_1 w. LFO nieuwe scaling(zie notes) CHECK THIS OUT : is teken van gekwadrateerde sinussen aangepast???!!!!!!!!!!!!!!! Osc_1 werkt goed 0803 CHECKUPTIME: (IN progress) backup gemaakt voor veiligheid -variabelen: - IN Pro4.type OF IN SUB ? V - STATIC OF LOCAL V ? TaskParamLabels LOCAL maken ? - INTEGER, SINGLE,... V - logische namen V - functies/subs: - logische namen V - aangepaste Task.Freq V(?) - declaraties vooraan IN code V - hebben alles sliders zin??? nee V - formules: - behouden teken bij kwadratering sinus - mapping en scaling bekijken - GMT: - Globharm miditaken checken - dubbele functions weg Met de GMT functies werkt het niet!!!! - geen losse getallen meer IN code > naar constants file V (+/-) 0813 nu 3 oscillators GLOBAL oscval IN .inc waarde gemapt op 0 - 1 waveform wordt hierop gemoduleerd ! taskfreq van wavwform bekijken ? waveform zelf midicontroller laten uisturen? (laat morfende klanken toe ?) 0830 oscillators tonen nu hun frequentie IN caption BAR 0906 P_Engine gecorrigeerd toont nu ook zijn waarden IN caption BAR P_Engine II : idem 0907 alle taken zijn nu voorzien van een EXIT SUB bij het einde van de initialisatie als zze voor het eerst aanroepen worden. Dit om voortijdig aangezette noten en out OF range values te vermijden. beginnen gaat nu via de Start BUTTON begonnen aan een taak die een beta kurve moet maken Master taak voorzien P4_Listen taak voorzien !!!!!!!!!!!!!! AWFUL PB BUG DETECTED !!!!!!!!!!!!!!!!!!!!!! bij een out - OF range aanroeping van een ARRAY krijg je zelfs niet altijd een invalid PAGE fault van windows; soms wordt gewoon een andere variabele veranderd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Things TO DO: time management bekijken; computer thuis kan al niet meer volgen ! 0908 Beta1 werkt code oscillators verbeterd; value wordt niet meer getoond ! 0909 IN Kristof.bas: task die waves speelt; werkt de te spelen wavs moeten via dat file ingeladen worden: ReadPatternRecognitionDataFile "Kristof.dat" om de samples dan te spelen gewoon: Playsample bij iedere aanroeping wordt de volgende opgegeven sample gespeeld >>verouderd 0911 Oscillators en betacurve generators zijn nu niet meer aan bij start van programma ze moeten als volgt gebruikt worden: met de functio GetFreeMod moet een id gevraagd worden van de gebruikte oscillatro de functie zet de oscillator zelf aan als geen oscillator meer vrij is WORD id waarde -1 gegeven, anders het te gebruiken id als een oscillator niet meer gebruikt WORD moet functie ReleaseMod aanroepen worden > afzetten taak + resetten van Osc().Used, dat geset wordt door GetFeeMod ReleaseMod geeft %true als geslaagd, anders %false 0912 GetFreeMod moet nu params krijgen voor initialisatie Osc / Beta: Osc Beta Param1 (start)Freq (start)a Param2 (start)value (start)b Param3 (start)curveValue !!to be declared - used for duration Osc. en Beta Types zijn hiervoor aangevuld Sliders verwijderd uit Osc taken; de vroegere code wordt hier nog bewaard: 'oude code voor Osc_x SUB Osc_1 STATIC tasknr AS INTEGER STATIC counter AS SINGLE STATIC CStep AS SINGLE 'STATIC slnr() AS INTEGER STATIC OldOscfreq AS SINGLE STATIC id AS INTEGER 'LOCAL Curve AS SINGLE LOCAL i AS INTEGER LOCAL TEXT AS ASCIIZ * 24 'STATIC TaskParamLabels() AS ASCIIZ * 8 IF ISFALSE tasknr THEN tasknr = %LOsc id = 1 Osc(id).tasknr = tasknr 'Osc(id).Freq = 1 'frequency of oscillator (=n. Task.freq) 'freq en value geg. via GetFreeMod 'Osc(id).Value = 0 'Value of oscillator 'Curve = 2 'Task(tasknr).freq = GetNewOTaskFreq (Osc(id).Freq) Cstep =(2*Pi)/%OTaskFreqUnit counter =0 ' DIM Slnr(0 TO 1) ' DIM TaskParamLabels(0 TO 1) 'sliders niet meer nodig ' TaskParamLabels(0) = "Osc Freq" ' TaskParamLabels(1) = "Curve" ' IF Task(Tasknr%).hParam = %Null THEN ' MakeTaskParameterDialog BYVAL tasknr,UBOUND (TaskParamLabels)+ 1,0,TaskParamLabels() ' END IF ' FOR i = LBOUND(TaskParamLabels) TO UBOUND(TaskParamLabels) ' IF slnr(i) = %False THEN ' slnr(i) = TaskEX(tasknr%).SliderNumbers(i) 'get slidermumber given in GMT-code ' Slider(slnr(i)).stap = 1 ' END IF ' NEXT ' Slider(slnr(0)).maxval = %MHighVal ' Slider(slnr(0)).minval = 0 ' Slider(slnr(0)).value = SQR(Osc(id).Freq/2)*Slider(slnr(0)).maxval 'c.s. ' Slider(slnr(1)).maxval = 20 ' Slider(slnr(1)).minval = 0 ' Slider(slnr(1)).value = Curve*10 ' FOR i = LBOUND(TaskParamLabels) TO UBOUND(TaskParamLabels) '0 TO 2 ' SendMessage Slider(slnr(i)).h, %TBM_SETRANGE,%True, MakeLong(Slider(slnr(i)).minval, Slider(slnr(i)).maxval) ' SendMessage Slider(slnr(i)).h, %TBM_SETPAGESIZE,0,Slider(Slnr(i)).stap ' SendMessage Slider(Slnr(i)).h, %TBM_SETPOS,%True, Slider(Slnr(i)).value ' NEXT StopTask tasknr EXIT SUB END IF 'code voor oscillator die gemapt kan worden op param via dialoogbox counter = counter + CStep 'Osc(id).Freq = ((Slider(slnr(0)).value / Slider(slnr(0)).maxval)^2)*%MaxOscFreq +.001 '0-1Hz log 'Curve = Slider(slnr(1)).value/10 IF Osc(id).Freq <> OldOscFreq THEN TEXT = "Osc 1: "+ STR$((INT(Osc(id).Freq*1000))/1000)+" Hz" SendMessage Task(tasknr).hParam, %WM_SETTEXT, 0, VARPTR(TEXT) 'zet frequentie in caption bar Task(tasknr).freq = GetNewOTaskFreq(Osc(id).Freq) OldOscFreq = Osc(id).Freq END IF IF counter > 2* Pi THEN counter = (counter-2*Pi) Osc(id).Value =(SGN(SIN(counter)))*(ABS((SIN(counter)))^Osc(id).Speed) 'constructie met sign en abs om zeker teken te behouden END SUB Task Master doet iets voorlopigs als test 0915 task listen werkt, maar voorlopig nog zonder pitchbend GetPitchbend lijkt niet te werken !!! INPUT wordt verwerkt IN P4_GetLastNote (slave of Listen) P4_FillHistory (slave of GetLastNote) vult TYPE hist, waar ingormatie wordt bijgehouden over de laatste [P4_LengthOfHistory + 1] noten Master kan nu gebruik maken van hist. 0916 MChangeREng bepaalt waarden voor Amp en Curve a d h v een analyse die de (ON)regelmatigheid van de INPUT bepaalt ( = afwijking van laatste INPUT t.o.v gemiddelde en v d laatste [%P4_LengthOfHistory] noten de bepaling van de amp is erst omgekeerd met de INPUT (traag wordt vlug v.v.) gaat dan volgens betacurve naar 0 invloed van INPUT en daarna gaat Amp mee met de INPUT dit alles wordt herbegonnen, per stem afz, tss 60 en 75% v/h stuk 0923 Hist TYPE bevat nu ook .MajorChange > true bij een grote afwijking tov gem. van duur v/e noot (niet v/e rust). als true, dan rust voor computerstemmen !!!! opm.: nog bekijken wanneer ze precies herbeginnen !!! als ze herbeginnen : waveform wordt MHighVal, en daaslt volgens betacurve deze curves nemen altijd hetzelfde percentage IN van de overblijvende tijd, en worden bijgevolg steeds vlugger Dit is het enige wat MChangeWvfrm nog doet hierbij wordt met een flag gewerkt, die gezet wordt onmiddelijk na de major change als die flag gezet is, en alle stemmen zwijgen (SumSoundingNote < 1) dan worden de betacurves gestart MchangePEng veranderd (nog niet helemaal IN orde !!! dit was de voregere code: ' STATIC MaxInfOnPEng AS SINGLE 'Max toegelaten invloed op MidDif ' STATIC InfOnPeng AS SINGLE 'huidige invloed op MidDif ' STATIC Inf2OnPeng AS SINGLE ' MaxInfOnPEng = (Pro4.MaxDif/2) ' Pro4.MidDif = Pro4.MidDif - InfOnPeng '|Deze constructie om ook nog andere invloeden op ' InfOnPeng = Osc(idPEO).Value * Beta(idPEB).Value * MaxInfOnPeng '|MidDif toe te laten ' Pro4.MidDif = Pro4.MidDif + InfOnPeng '| ' IF Beta(idPEB2).used <>%false THEN ' Pro4.MidDif = Pro4.MidDif - Inf2OnPeng ' Inf2OnPeng =- Beta(idPEB2).value * Pro4.MaxDif ' Pro4.MidDif = Pro4.MidDif + Inf2OnPeng ' END IF !!!!!!!!!!OPM: !!!! verschillende betacurves worden al aangezet voor het begin van de compositie het resultaat is dan dat ze niet werken filter IN GetFreeMod laat dit niet toe, maar ook de taken moeten zordgen dat ze niet te voreg zijn met het aanroepen van BetaCurves >opgelost 0930 REngine en MChangeREng lijken een bruikbare ritmiek op te leveren i/h begin v/d compositie Inp Outp noten kort vlug lang traag rusten kort regelmatig ritme lang meer variatie IN snelheid IN het ritme Naar het einde toe, wordt de reactie op de lengte van noten volgens een betacurve, omgekeerd. IN het midden heeft de duur van de gespeelde noten weinig invloed. De reactie op rusten blijft gedurende heel het stuk gelijk. PEng en MchangePeng zijn bruikbaar MidDif oscilleert tusen %StartMinDif (0) en %StartMaxDif (50) als een geaccentueerde noot gespeeld wordt (meer dan +%Flute_Accent van Velo tov average en vorige twee) GetLbSR / UbSR niet meer gebruikt; hier is de code nog: 'FUNCTION GetLbSR!(LbSR AS SINGLE) 'LbSR is given as centnote ' STATIC initialised AS INTEGER 'DIT KAN EFFICIENTER !!!!!!!!!!!!!!!!!!! ' STATIC idB AS INTEGER 'id of betacurve ' IF ISFALSE initialised THEN ' IF ISFALSE BUTTON(1).flag THEN EXIT FUNCTION ' initialised = %true ' idB = GetFreeMod (%Beta,.7,.2,-1) 'curve die zeer traag begint !!, over hele stuk ' END IF ' IF LbSr > %MLowVal THEN ' LbSr = F2CN(%StartLbSR) + ((F2CN(%StartLbSR) - %MLowVal) * Beta(idB).value) ' END IF ' FUNCTION = LbSR 'END FUNCTION 'FUNCTION GetUbSr!(Ubsr AS SINGLE) ' STATIC initialised AS INTEGER ' STATIC idB AS INTEGER ' IF ISFALSE initialised THEN ' IF ISFALSE BUTTON(1).flag THEN EXIT FUNCTION ' Initialised = %true ' idB = GetFreeMod (%Beta,1.5,.8,-1) ' END IF ' IF UbSR < %MHighVal THEN ' UbSR = F2CN(%StartUbSR) - ((%MHighVal - F2CN(%StartUbSR)) * Beta(idB).value) ' END IF ' FUNCTION = UbSr 'END FUNCTION oude code voor MChangeReng: ' STATIC tog AS INTEGER ' STATIC idB() AS INTEGER ' STATIC RetVal() AS SINGLE '' LOCAL i AS INTEGER ' LOCAL tekst AS ASCIIZ * 16 ' IF ISFALSE tog THEN ' IF ISFALSE BUTTON(1).flag THEN EXIT SUB ' tog = %true ' DIM idB(%LVoice TO %UVoice) ' DIM RetVal(%LVoice TO %UVoice) ' idB(%LVoice) = GetFreeMod (%Beta, 2,0,70) ' idB(%MVoice) = GetFreeMod (%Beta, 3,0, 65) ' idB(%UVoice) = GetFreeMod (%Beta, 4,0, 75) ' FOR i = %LVoice TO %UVoice ' 'IF idB(i) < 0 THEN ' ' MSGBOX "ERR: No Beta's available _ VoiceNr: " + STR$(i) ' 'END IF ' NEXT ' END IF ' Hist.MajorChange = %false ' SELECT CASE ABS(Hist.Pregnancy(0) - Hist.AvPreg) ' = afwijking v duur t.o.v gemiddlde ' CASE < ((Hist.Pregnancy(0)+Hist.AvPreg) / 16) 'minder dan 1/8 verschil met average v/d 2 ' Pro4.RCurve = Pro4.RCurve + .003 '.003 controleren ' tekst = tekst + "Inc RC" ' CASE >((Hist.AvPreg+Hist.Pregnancy(0)) / (2 * .9) ) ' Hist.MajorChange = %true ' ' MChangeWvfrm (hParent) ' tekst = tekst + "LDec RC" ' Pro4.RCurve = Pro4.RCurve - .006 ' CASE > ((Hist.Pregnancy(0)+Hist.AvPreg) / 6) ' tekst = tekst + "LDec RC" ' Pro4.RCurve = Pro4.RCurve - .006 ' CASE > ((Hist.Pregnancy(0)+Hist.AvPreg) /14) ' Pro4.RCurve = Pro4.RCurve - .003 ' tekst =tekst + "Dec RC" ' CASE ELSE ' END SELECT ' SELECT CASE ABS (Hist.Rust(0) - Hist.AvRust) ' CASE < ((Hist.Rust(0) + Hist.AvRust)/(2*8)) ' Pro4.RCurve = Pro4.RCurve + .004 ' ' CASE > ((Hist.Rust(0) + Hist.AvRust) / (2 * 1.5)) ' ' Hist.MajorChange = %true ' ' Pro4.RCurve = Pro4.RCurve - .006 ' CASE > ((Hist.Rust(0) + Hist.AvRust) / (2*3)) ' Pro4.RCurve = Pro4.RCurve - .007 ' CASE > ((Hist.Rust(0) + Hist.AvRust) * (2 * 7)) ' Pro4.RCurve = Pro4.RCurve -.004 ' CASE ELSE ' END SELECT ' FOR i = 1 TO %P4_LengthOfHistory 'verschil i duur i vgl met ' SELECT CASE (Hist.Pregnancy(0) - Hist.Pregnancy(i)) 'rest buffer ' CASE < ((Hist.Pregnancy(0) + Hist.Pregnancy(i))/(2*8)) ' Pro4.RCurve = Pro4.RCurve + 1/(20 * i) 'wordt kleiner naarmate langer geleden ' CASE > ((Hist.Pregnancy(0) + Hist.Pregnancy(i))/(2*5)) ' Pro4.RCurve = Pro4.RCurve - 1/(22 * i) ' CASE ELSE ' END SELECT ' SELECT CASE (Hist.Rust(0)- Hist.Rust(i)) ' CASE < ((Hist.Rust(0) + Hist.Rust(i))/(2*8)) ' Pro4.RCurve = Pro4.RCurve + 1/(18*i) ' CASE > ((Hist.Rust(0) + Hist.Rust(i))/(2*5)) ' Pro4.RCurve = Pro4.RCurve - 1/(20*i) ' CASE ELSE ' END SELECT ' NEXT ' IF Pro4.RCurve > 1 THEN Pro4.RCurve = 1 ' IF Pro4.RCurve <0 THEN Pro4.RCurve = 0 ' FOR i = %LVoice TO %UVoice ' IF Beta(idB(i)).used = %false THEN ' idB(i) = GetFreeMod(%Beta, .4, 0 ,-1) ' END IF ' Pro4.Amp(i) = Pro4.Amp(i) - RetVal(i) ' RetVal(i)= (Hist.AvFreq - Pro4.Amp(i)) * (((Beta(idB(i)).value) *3) - 1) '3 was 2, reden voor 3 : amps meer in extremen laten gaan ' Pro4.Amp(i) = Pro4.Amp(i) + RetVal(i) ' 'als betacurve laag is > AvFreq wordt tegengesproken ' 'als BetaCurve hoog is > AvFreq wordt gevolgd ' IF Pro4.Amp(i) < MinTaskFreq THEN Pro4.Amp(i) = MinTaskFreq ' IF Pro4.Amp(i) > MaxTaskFreq THEN Pro4.Amp(i) = MaxTaskFreq ' NEXT ' tekst = STR$(Hist.AvPreg) + STR$ (Hist.Pregnancy(0)) 'Pro4.RCurve) ' sendmessage hParent, %WM_SETTEXT,0,VARPTR(tekst) 1001 MChangeVol als fluit te luid speelt: volume naar beneden volgens betacurve, daarna weer omhoog !!!!! NOG VERDER TE DEBUGGEN 1006 versie van vorige dagen blijkt slechter te werken dan oude backup backup van 30930 wordt nu gebruikt om verder mee te werken SUB feedback zet gegeven tekst IN LISTBOX zowel voor OUTPUT naar player als voor feedback taken /subs die een modulation device gebruiken, moeten een eigen id hebben, dat doorgeg w aan GetFreeMod Beta().Used wordt dan dit id zo kan de SUB later weten of een osc/beta nog voor die taak werkt, of dat die intussen door een andere taak is gebruikt MChVol toegvoegd, werkt correct: Als de fluit luid blijft spelen , zakt het vol IN 3 " naar 0 en keert (te?) traag naar Max inifile created (Process4.ini) ReadP4DataFromFile leest ze. constanten die zonder compileren veranderbaar moeten zijn, moeten globals worden, die via deze functie ingevuld worden De volledigheid van de inifile is essentieel voor de goede werking van Processing #4 1007 inifile ingevuld Ritme werkt beter, nog niet perfect opm!! altijd aanpassing maken als ofwel aleen bij nieuwe noot snelheid berekend wordt, of bij ieder cll naar master !! GetnewVTaskFreq blijkt niet meer gebruikt te zijn, hier oude code: 'FUNCTION GetNewVTaskFreq! (i AS INTEGER,c AS INTEGER) 'TaskFreq for rhytm!! used by R_engine ' IF ISFALSE BUTTON(1).flag THEN ' EXIT FUNCTION ' END IF ' feedback "GetNewVTaskFreq" ' 'voor berekenen sin1-3 Task.Freq in R_Engine ' LOCAL a AS SINGLE ' LOCAL ampl AS SINGLE 'amplitude = maxtaskfreq - mintaskfreq ' ' ampl = (Pro4.MaxTaskFreq - Pro4.MinTaskFreq) ' ' a = MinTaskFreq + Ampl*(1+COS(Pi * c/(Task(%LEngine).Freq * (%RESlowness))))/2 '^Pro4.RCurve) '%RESlowness was - +i ' a = MinTaskFreq + Pro4.Amp * (1 + COS(Pi * c/(Task(%LEngine).Freq * (%RESlowness)))) / 2 ' IF a>MaxTaskFreq THEN a = MaxTaskFreq ' FUNCTION = a ' 'END FUNCTION Pro4.Amp reageert juist op INPUT, maar binnen een veel te klein gebied > aangepast, formule vereenvoudigd mogelijk schrijffout met PEEK$, POKE ... task p4_playpat moet delayline aanschakelen als IsPatterninteresting < 0 tot %P4_LengthOfHistory + 1 verschillende stemmen tegelijk mogelijk NOG DEBUGGEN waarschijnlijk oorzaak van pagefault vorige versie van procesing #4 bewaard op diskette voor de veiligheid, alleen vervangen als dit werkt 1015 ispatterninteresting werkt (vult waspatterninteresting(GLOBAL) IN, die gereset w na gebruik Savepattern werkt (waarschijnlijk ook goed) fouten IN playpat: - afspeeltempo klopt niet ?? - speelt niet altijd een delayline na herkenning van een saai patroon 1019 toch fouten gevonden IN savepattern, opgelost, werkt nu perfect playpat werkt beter ? misschien nog niet helemaal perfect na herkenning van een patroon, worden de eerste 3/4 volgende patronen niet geanalyseerd het eerst pattroon dat backgeplayd wordt is zeer traag, het volgende iets vlugger,... ispatterninteresting houdt nu ook rekening met de frequentie waarmee een bepaald interval voorkomt 1020 patroonspeelrelated taken verbeterd, lijken nu helemaal IN orde Betacurves voor volume moeten nog beter afgeregeld worden. Coda gemaakt, McVol en PattPlay reageren op GLOBAL var Coda gset IN master bij rusten: Maxdiff kan groter w, volgt 2 sinussen 1021 grote kuis debugger verwijderd (feedbackwindow kan gebruikt w i d plaats 'SUB Debugger ' STATIC tasknr AS INTEGER ' STATIC OldPro4 AS Pro4Type ' STATIC OldTaskFreq () AS SINGLE ' STATIC filenr1 AS LONG,filenr2 AS LONG ',filenr3 AS LONG,filenr4 AS LONG ' STATIC counter AS INTEGER ' STATIC OldHistPreg0 AS LONG ' LOCAL i AS INTEGER ' IF ISFALSE tasknr THEN ' DIM OldTaskFreq(%LVoice TO %UVoice) ' tasknr = 56 ' filenr1 = FREEFILE ' OPEN "P4_history.txt" FOR OUTPUT AS filenr1 ' starttask 38 ' EXIT SUB ' END IF ' counter = counter + 1 ' ' IF hist.pregnancy(0) <> OldHistPreg0 THEN ' OldHistPreg0 = Hist.Pregnancy(0) ' PRINT #filenr1, "Cycle: " , counter ' FOR i = 0 TO %P4_LengthOfHistory ' PRINT #filenr1, i;hist.rust(i), ' NEXT ' PRINT #filenr1," " ' PRINT #filenr1, "TotRust: ";Hist.TotRust,"AvRust: ",Hist.AvRust ' PRINT #filenr1, ' END IF ' IF counter >= 6000 THEN ' PRINT #filenr1, "EOF" ' CLOSE #filenr1 ' Stoptask tasknr ' END IF 'END SUB nog een beter einde verzinnen! 1022 pro4.flag wordt meer gebruikt IN plaats van aant GLOBAL variables die toch maar 1/0 waren Pro4.flag AND %d1 kind of things vervangen door BIT( SET /RESET/ ...) 'bit d0 = accent gespeeld (comu McPengII > MChWvfrm 'bit d1 = loudness rcognized 'bit d2 = coda started 'bit d3 = nieuwe noot gespeeld (was newnoteplayed) zie P4_types file functie IsAccentPlayed gemaakt om accent te herkennen (slave van MChaPEng) gebruikt waarden die IN ini-file moeten staan onder [REGISTER-TO-VELOCITY] nr 'aantal ranges LBOUND, UBOUND, acc-velocity-waarde 'v/range usw 'no comment in this block !!!! 1026 Showlastnote toont nu ook herhaalde noten ander einde: laatste noot v iede rpatroon blijft klinken tot 5'' na einde 1103 Na test m fluit: herdefinieren van accent: - ofwel een plotselinge sprong IN de tessituur afhankelijk v/d tessituur v/history, hoe groter die is, hoe minder vlug een sprong - ofwel een plotselinge sprong IN pregnancy verschil v meer dan *4 of /4 met resp langste of kortste noot uit hist ? werkt precies nog niet helemaal goed - ofwel een noot na een lange rust ( + 10 s) 1104 Backup die goed werkte; het volgende is na de backup aan Process4 gewijzigd: Pro4.Min/MaxTaskfreq zijn nu gedimensioneerd>> worden per stem afzonderlijk ingevuld en gebruikt !!! ook file types is hierdoor gewijzigd !! Het verschil tussen de stemmen lijkt over het algemeen toch niet zo heel groot Begin veranderd: bij drukken op startknop:akkoord (startnoten uit ini-file), dat blijft klinken tot fluit iets speelt EOF