diff options
Diffstat (limited to 'BID-rework/bid.udo')
-rw-r--r-- | BID-rework/bid.udo | 431 |
1 files changed, 0 insertions, 431 deletions
diff --git a/BID-rework/bid.udo b/BID-rework/bid.udo deleted file mode 100644 index 4c0e797..0000000 --- a/BID-rework/bid.udo +++ /dev/null @@ -1,431 +0,0 @@ -#ifndef UDO_BID -#define UDO_BID ## -/* - Debugger - Unfixed Bugs : BUG #5 - - Bug Infested Directive file parser v1 and tools - - Designed to create a reusable loop based score format in the Unfixed Bugs project and beyond. -*/ - - -#define BID_VERSION #1.1# - -#include "txt_tools.udo" - -; globals -gibid_tempo init -1 ; beats per minute -gibid_beattime init -1 ; time of one beat in second -gibid_maxsection init -1 ; max number of sections -gibid_chordfn init -1 ; current chord ftable -gkbid_chordlength init -1 ; current chord length - -; BID internals -gibid_sectionmax init 64 -gibid_sectionlengths ftgen 0, 0, -gibid_sectionmax, -7, 0 ; section lengths -gibid_sections ftgen 0, 0, -pow(gibid_sectionmax, 2), -7, 0 ; section pointers to data: dim0=section, dim1=instrument -gibid_sectiondata ftgen 0, 0, -(99*6), -7, 0 ; section data, ftables contained: dim0=ID, dim1=parameter ftable number - -gibid_chordgroups[][] init 16, 12 ; chord groups, pointers to sectionchords by section -gibid_sectionchords[] init 16 ; ftables of section chords - -gibid_currentchordnum = 0 ; current chord number -gibid_lastchordgroup = -1 ; last chord group -gibid_lastsection = -1 ; last section - -gSbid_sequenced[] init 1 ; internal tracking of sequenced elements -gibid_sequenceinit init 1 ; internal tracking of sequenced init -gibid_swingtime init -1 ; swing time calculated from percent - -/* - Get BID instrument index, creating new reference if specified. - Internal use only. - - index _bid_gettextindex Sname, [iaddifnotexists = -1] - - index BID instrument index - - Sname name to look up or create - iaddifnotexists 1=create , default=fatal if not exists -*/ -opcode _bid_gettextindex, i, Sj - Sname, iaddifnotexists xin - ifinalindex = -1 - index = 0 - while (index < lenarray(gSbid_sequenced)) do - if (strcmp(gSbid_sequenced[index], Sname) == 0) then - ifinalindex = index - igoto complete - endif - index += 1 - od - - if (iaddifnotexists == 1) then - if (gibid_sequenceinit == 1) then - gibid_sequenceinit = 0 - SequencedNew[] fillarray Sname - ifinalindex = 0 - else - SequencedNew[] init lenarray(gSbid_sequenced) + 1 - index = 0 - while (index < lenarray(gSbid_sequenced)) do - SequencedNew[index] = gSbid_sequenced[index] - index += 1 - od - SequencedNew[index] = Sname - ifinalindex = index - endif - gSbid_sequenced = SequencedNew - igoto complete - else - tt_notify_fatal(sprintf("Sequenced index for '%s' not found", Sname)) - endif - -complete: - xout ifinalindex -endop - - - -/* - Parse a row of comma-separated numerical values of either patterns or chords. - Internal use only. - - inum _bid_parserowitems Sline, ix1, ix2, imode - - inum number of elements found parsed - - Sline input line - ix1 array dimension 1 index - ix2 array dimension 2 index - imode 0=count elements; 1=write patterns; 2=write chords -*/ -opcode _bid_parserowitems, i, Siii - Sline, ix1, ix2, imode xin - inum = 0 - while (strlen(Sline) > 0) do - icomma = strindex(Sline, ",") - Stemp = strsub(Sline, 0, icomma) - icomma = (icomma == -1) ? 0 : icomma - Sline = strsub(Sline, icomma + 1) - if (imode == 1) then - tabw_i strtod(Stemp), inum, gibid_sectiondata[ix1][ix2] - elseif (imode == 2) then - tabw_i strtod(Stemp), inum, gibid_chordgroups[ix1][ix2] - endif - inum += 1 - od - xout inum -endop - - - -/* - Read BID data for specified element and trigger accordingly. - - bid_seq Splayer, kposition, ksection - - Splayer name of BID element - kposition position in pattern provided by master sequencer - ksection section in composition provided by master sequencer - -*/ -opcode bid_seq, 0, Skk - Splayer, kpos, ksection xin - Sinstrument = sprintf("play_%s", Splayer) - instrindex = _bid_gettextindex(Splayer) - kdata = tab:k(ksection * gibid_sectionmax + instrindex, gibid_sections) - - if (kdata != -1) then ; null section - tab:k(kpos, - kon = tablekt:k(kpos, gibid_sectiondata[kdata][0]) - - if (kon == 1) then - kchance = tablekt:k(kpos, gibid_sectiondata[kdata][3]) - if (random:k(0, 1) < kchance) then - ktime = (kpos % 2 == 0) ? 0 : gibid_swingtime - kdur = tablekt:k(kpos, gibid_sectiondata[kdata][1]) * gibid_beattime - ;kamp = tablekt:k(kpos, gisectiondata[kdata][2]) - event "i", Sinstrument, ktime, kdur, kpos, kdata - endif - endif - endif -endop - - -/* - Get a parameter for the specified pattern position. - ipos and idataindex are provided as p4 and p5 to instruments scheduled by bid_seq, - hence can typically used as bid_getparameter(p4, p5, iparameter) - - idata bid_getparameter ipos, idataindex, iparameter - - idata the resulting value - - ipos position in pattern - idataindex section specific data index; pointer to ftable - iparameter parameter index as in BID file; defaults include 0=on/off, 1=duration, 2=amp, 3=chance - -*/ -opcode bid_getparameter, i, iii - ipos, idataindex, iparameter xin - ifn = tab_i(idataindex * gibid_sectionmax + iparameter, gibid_sectiondata) - xout tab_i(ipos, ifn) -endop - - -/* - Get a section length in beats - - klength bid_getsectionlength ksection - - klength length in beats - - ksection section to look up -*/ -opcode bid_getsectionlength, k, k - ksection xin - xout tab:k(ksection, gibid_sectionlengths) -endop - -/* - Parse a row of comma-separated values to either section patterns or chord storage. - Scans row, assigns ftable of appropriate length and then fills ftable. - Internal use only. - - _bid_parserow Sline, ix1, ix2, imode - - Sline line to parse - ix1 array dimension 1 index of target storage - ix2 array dimension 2 index of target storage - imode 1=section patterns, 2=chords -*/ -opcode _bid_parserow, 0, Siii - Sline, ix1, ix2, imode xin - isize = _bid_parserowitems(Sline, ix1, ix2, 0) - if (imode == 1) then - ifn ftgen 0, 0, -isize, -7, 0 - tabw_i(ifn, ix1 * gibid_sectionmax + ix2, gibid_sectiondata) - elseif (imode == 2) then - gibid_chordgroups[ix1][ix2] ftgen 0, 0, -isize, -7, 0 - endif - isize = _bid_parserowitems(Sline, ix1, ix2, imode) -endop - - - -/* - Parse a line from a BID string - Internal use only. - - idataout[] _bid_parseline Sline, idatain[] - - idataout[] state data - - Sline line to parse - idatain[] state data - -*/ -opcode _bid_parseline, i[], Si[] - Sline, idata[] xin - iparameter = idata[0] - isection = idata[1] - ichordnum = idata[2] - isectiondataindex = idata[3] - imode = idata[4] - - if (strlen(Sline) > 0) then - Sfirstchar = strsub(Sline, 0, 1) - - ; comment - if (strcmp(Sfirstchar, ";") == 0) then - ; no action - - ; version check - elseif (strcmp(Sfirstchar, "v") == 0) then - imode = 0 - iversion = strtod(strsub(Sline, 2)) - if (iversion != $BID_VERSION) then - tt_notify(sprintf("Incompatible BID file version: got %.2f , expected %.2f", iversion, $BID_VERSION)) - exitnow - endif - - ; section header - elseif (strcmp(Sfirstchar, "s") == 0) then - imode = 1 - icomma = strindex(Sline, ",") - isectionnum = strtod(strsub(Sline, 2, icomma)) - Sub = strsub(Sline, icomma+1) - icomma = strindex(Sub, ",") - isectionlength = strtod(strsub(Sub, 0, icomma)) - ichordgroup = strtod(strsub(Sub, icomma+1)) - gibid_sectionchords[isectionnum] = ichordgroup - tabw_i isectionlength, isectionnum, gibid_sectionlengths - - ; tempo - elseif (strcmp(Sfirstchar, "b") == 0) then - imode = -1 - icomma = strindex(Sline, ",") - gibid_tempo = strtod(strsub(Sline, 2, icomma)) - gibid_beattime = 60 / gibid_tempo - iswingpercent = strtod(strsub(Sline, icomma+1)) - gibid_swingtime = ((gibid_beattime/4)/100) * iswingpercent - - ; chord group header - elseif (strcmp(Sfirstchar, "c") == 0) then - imode = 3 - ichordgroup = strtod(strsub(Sline, 2)) - ichordnum = 0 - - ; pattern header - elseif (strcmp(Sfirstchar, "i") == 0) then - imode = 4 - iparameter = 0 - - icomma = strindex(Sline, ",") - instrindex = _bid_gettextindex(strsub(Sline, 2, icomma), 1) - Sub = strsub(Sline, icomma+1) - icomma2 = strindex(Sub, ",") - isection = strtod(strsub(Sub, 0, icomma2)) - if (isection > gibid_maxsection) then - gibid_maxsection = isection - endif - if (icomma2 != -1) then ; repeat or null section - irepeatsection = strtod(strsub(Sub, icomma2+1)) - if (irepeatsection == -1) then - inewsection = -1 - else - inewsection = tab_i(irepeatsection * gibid_sectionmax + instrindex, gibid_sections) - endif - tabw_i(inewsection, isection * gibid_sectionmax + instrindex, gibid_sections) - ;gibid_sections[isection][instrindex] = inewsection - else - isectiondataindex += 1 - tabw_i(isectiondataindex, isection * gibid_sectionmax + instrindex, gibid_sections) - endif - - ; chord row - elseif (imode == 3) then - _bid_parserow(Sline, ichordgroup, ichordnum, 2) - ichordnum += 1 - - ; pattern row - elseif (imode == 4) then - _bid_parserow(Sline, isectiondataindex, iparameter, 1) - iparameter += 1 - endif - endif - idata[0] = iparameter - idata[1] = isection - idata[2] = ichordnum - idata[3] = isectiondataindex - idata[4] = imode - xout idata -endop - - -/* - Parse a Bug Infested Directive Format string to global arrays, ftables and variables. - Handles patterns, tempo, chord groups and sections etc accordingly. - - bid_loadtext Sfile, [imode = 0] - - Stext directive data as string to parse -*/ -opcode bid_loadtext, 0, S - Stext xin - idata[] fillarray -1, -1, -1, -1, -1 -read: - index = strindex(Stext, "\n") - if (index != -1) then - Sline = strsub(Stext, 0, index) - Stext = strsub(Stext, index + 1) - idata[] _bid_parseline Sline, idata - - igoto read - else - igoto complete - endif - -complete: -endop - - -/* - Parse a Bug Infested Directive Format string to global arrays, ftables and variables. - Handles patterns, tempo, chord groups and sections etc accordingly. - Requires readfi support which is not available on all platforms. Platforms that do not support that - should set NOFILEIO. - - bid_loadfile Sfile - - Sfile directive file to parse -*/ -opcode bid_loadfile, 0, S - Sfile xin -#ifdef NOFILEIO - tt_notify_fatal("Attempting to use parsefile when NOFILEIO is set") -#else - if (filevalid(Sfile) == 0) then - tt_notify(sprintf("Directive file cannot be found: '%s'", Sfile)) - exitnow - endif - idata[] fillarray -1, -1, -1, -1, -1 -read: - Sline, ilinenum readfi Sfile - Sline = tt_stripnewline(Sline) - - idata[] _bid_parseline Sline, idata - - if (ilinenum != -1) igoto read -#endif -endop - - - -/* - Set the current chord given a section - p4 the section number - p5 0=start at beginning, 1=increment chord index -*/ -instr bid_setcurrentchord - isection = p4 - ichordincrement = p5 - if (isection > gibid_maxsection) then - turnoff - endif - - ichordgroup = gibid_sectionchords[isection] - if (ichordgroup != gibid_lastchordgroup || isection != gibid_lastsection) then - gibid_currentchordnum = 0 - gibid_lastchordgroup = ichordgroup - gibid_lastsection = isection - elseif (ichordincrement == 1) then - if (gibid_currentchordnum + 1 < lenarray(gibid_chordgroups, 2) - 1) then - if (gibid_chordgroups[ichordgroup][gibid_currentchordnum + 1] == 0) then - gibid_currentchordnum = 0 - else - gibid_currentchordnum += 1 - endif - else - gibid_currentchordnum = 0 - endif - else - gibid_currentchordnum = 0 - endif - - ifn = gibid_chordgroups[ichordgroup][gibid_currentchordnum] - - if (ifn > 0) then - gkbid_chordlength = tab:k(0, ifn) - gibid_chordfn = ifn - endif - - if (timeinstk() > 2) then - turnoff - endif -endin - - -#end - |