diff options
Diffstat (limited to 'BUG9')
-rw-r--r-- | BUG9/BUG9.csd | 145 | ||||
-rw-r--r-- | BUG9/bid.udo | 425 | ||||
-rw-r--r-- | BUG9/bid_source.udo | 84 | ||||
-rw-r--r-- | BUG9/bussing.udo | 67 | ||||
-rw-r--r-- | BUG9/instruments.udo | 179 | ||||
-rw-r--r-- | BUG9/txt_tools.udo | 82 | ||||
-rw-r--r-- | BUG9/wavetables.udo | 16 |
7 files changed, 998 insertions, 0 deletions
diff --git a/BUG9/BUG9.csd b/BUG9/BUG9.csd new file mode 100644 index 0000000..f320921 --- /dev/null +++ b/BUG9/BUG9.csd @@ -0,0 +1,145 @@ +<CsoundSynthesizer> +<CsOptions> +-odac +-m0 +</CsOptions> +<CsInstruments> +/* + Debugger - Unfixed Bugs : BUG #8 + + http://git.1bpm.net/csd-unfixedbugs1/about/ + + By Richard Knight 2021 + http://1bpm.net + q@1bpm.net + +*/ + +sr = 44100 +ksmps = 100 +nchnls = 2 +0dbfs = 1 +seed 0 + +#define NOFILEIO ## ; file IO with readfi not supported on all platforms: disables bid_loadfile + +gkmastergain init 1 ; master gain +gkpump = 0 ; kick ducking control +gksection init -1 + +#include "wavetables.udo" ; general waveforms +#include "bussing.udo" ; global audio bussing +#include "bid.udo" ; Bug Infested Directive tools and parsing +#include "instruments.udo" ; sound generators +#include "txt_tools.udo" ; text tools + + +/* + Master audio output +*/ +instr global_master + igain = 1 + aL, aR bus_read "master" + aL limit aL*0.5, -1, 1 + aR limit aR*0.5, -1, 1 + outs aL*gkmastergain*igain, aR*gkmastergain*igain +endin + + +/* + Print notification of performance time since last notification + or if isection is -1, print completion notification +*/ +gitimetrack times +instr notify_change + isection = p4 + itime times + if (isection == -1) then + tt_notify(sprintf"Complete, runtime: %s", tt_parsetime(itime))) + exitnow + else + isectiontime = itime - gitimetrack + tt_notify(sprintf("%s : section %d complete in %s", tt_parsetime(itime), isection, tt_parsetime(isectiontime))) + gitimetrack = itime + endif + turnoff +endin + + +/* + Parse BID file and run the sequencer +*/ +instr parseandrun + tt_notify("Parsing events") + + #include "bid_source.udo" + bid_loadtext(SBID) + + tt_notify("Running sequencer") + event_i "i", "sequencer", 0, 3600 + turnoff +endin + + + +/* + Sequence BID elements +*/ +instr sequencer + isection = 1 + event_i "i", "bid_setcurrentchord", 0, 1, isection, 0 + event_i "i", "global_master", 0, p3 + kmetro metro (gibid_tempo / 60) * 4 + kpos init 0 + kposabs init 0 + ksection init isection + kposchord init 0 + gksection = ksection + if (kmetro == 1) then + if (ksection > gibid_maxsection) then + event "i", "notify_change", p3, 1, -1 + turnoff + endif + + ; sequence BID elements + bid_seq "kick", kpos, ksection + bid_seq "clap", kpos, ksection + bid_seq "hat1", kpos, ksection + bid_seq "hat2", kpos, ksection + bid_seq "bass", kpos, ksection + bid_seq "mel1", kpos, ksection + bid_seq "mel2", kpos, ksection + + kpos = (kpos < 31) ? kpos + 1 : 0 + ksection16ths = bid_getsectionlength(ksection) * 4 + + if (kposabs+1 < ksection16ths) then + kposabs += 1 + else + event "i", "notify_change", 0, 1, ksection + ;event "i", "play_crash", 0, gibid_beattime + ksection += 1 + kposchord = 0 + kpos = 0 + kposabs = 0 + event "i", "bid_setcurrentchord", 0, 1, ksection, 1 + endif + + + if (kposchord+1 < gkbid_chordlength*4) then + kposchord += 1 + else + kposchord = 0 + event "i", "bid_setcurrentchord", 0, 1, ksection, 1 + endif + + + endif + +endin + +</CsInstruments> +<CsScore> +i"parseandrun" 0 1 +</CsScore> +</CsoundSynthesizer> diff --git a/BUG9/bid.udo b/BUG9/bid.udo new file mode 100644 index 0000000..17e9be2 --- /dev/null +++ b/BUG9/bid.udo @@ -0,0 +1,425 @@ +#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_sectionlengths ftgen 0, 0, -64, -7, 0 ; section lengths +gibid_sections[][] init 64, 64 ; section pointers to data +gibid_sectiondata[][] init 99, 6 ; section data, ftables contained + +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 = gibid_sections[ksection][instrindex] + + if (kdata != -1) then ; null section + 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 + xout tab_i(ipos, gibid_sectiondata[idataindex][iparameter]) +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 + gibid_sectiondata[ix1][ix2] ftgen 0, 0, -isize, -7, 0 + 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 = gibid_sections[irepeatsection][instrindex] + endif + gibid_sections[isection][instrindex] = inewsection + else + isectiondataindex += 1 + gibid_sections[isection][instrindex] = isectiondataindex + 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 + diff --git a/BUG9/bid_source.udo b/BUG9/bid_source.udo new file mode 100644 index 0000000..205939b --- /dev/null +++ b/BUG9/bid_source.udo @@ -0,0 +1,84 @@ +/* + Debugger - Unfixed Bugs : BUG #8 + + Bug Infested Directives source + Provided as a string due to readfi not being available on all platforms. + Used with bid_loadtext (whereas a separate file would be used with bid_loadfile and requires readfi support) +*/ + +SBID = {{ +; Bug Infested Directives : Debugger - Unfixed Bugs : BUG #4 +v 1.1 + +; tempo, swing percent +b 121, 42 + +; chord groups +c 1 + 4, 60, 65, 67, 75, 77 + 4, 63, 65, 66, 71, 72 + + +; sections: section number, length, chordgroup +s 1, 64, 1 + + +; patterns: trig , dur, amp, chance + + +i clap, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 + 0, 0, 0, 0,.2, 0, 0, 0, 0, 0, 0, 0,.2, 0, 0,.2, 0, 0, 0, 0,.2, 1, 0, 0, 0, 0, 0, 0,.2, 0, 0, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + +i bass, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 + .2,.2,.2,.2,.2,.4,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.4,.2,.2,.2,.2,.4,.2,.2,.2,.2,.2,.2,.2,.2,.2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + .8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8 + + +i mel1, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 + .2,.2,.2,.2,.2,.4,.2,.4,.2,.2,.4,.2,.2,.2,.9,.2,.5,.4,.2,.2,.2,.2,.4,.2,.2,.2,.2,.2,.2,.2,.2,.2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + .8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8,.8 + + + +i hat1, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1,.6, 1, 1, 1, 1, 1, 1, 1,.6, 1,.6, 1, 1, 1, 1, 1,.6, 1, 1, 1, 1, 1, 1, 1,.2 + 1, 1, 1, 1, 1, 1, 1, 1, 1,.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.5, 1,.5, 1, 1, 1, 1, 1, 1 + + +i hat2, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.2,.05, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + + +i mel2, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.1,.1,.1,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2,.2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + + +i kick, 1 +; 1 - - - 2 - - - 3 - - - 4 - - - 5 - - - 6 - - - 7 - - - 8 - - - + 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 + .4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.4,.3,.3 + 1, 0,.8, 0, 1, 0,.5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0,.8, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0,.6,.6 + 1, 1,.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,.6,.2 + +}} diff --git a/BUG9/bussing.udo b/BUG9/bussing.udo new file mode 100644 index 0000000..62e4e1c --- /dev/null +++ b/BUG9/bussing.udo @@ -0,0 +1,67 @@ +#ifndef UDO_BUSSING +#define UDO_BUSSING ## +/* + Debugger - Unfixed Bugs : BUG #4 + + Global audio bussing +*/ + + +/* + Get the stereo L and R names for a singular bus name + + SnameL, SnameR bus_name Sbus + + SnameL left bus identifier + SnameR right bus identifier + + Sbus bus name +*/ +opcode bus_name, SS, S + Sbus xin + xout sprintf("%sL", Sbus), sprintf("%sR", Sbus) +endop + + +/* + Mix to a stereo bus + + bus_mix Sbus, aL, aR + + Sbus bus name + aL left channel + aR right channel +*/ +opcode bus_mix, 0, Saa + Sbus, aL, aR xin + SbusL, SbusR bus_name Sbus + chnmix aL, SbusL + chnmix aR, SbusR +endop + + + +/* + Read from a stereo bus, and then clear the bus + + aL, aR bus_read Sbus + + aL left channel + aR right channel + + Sbus bus name +*/ +opcode bus_read, aa, S + Sbus xin + SbusL, SbusR bus_name Sbus + aL chnget SbusL + aR chnget SbusR + chnclear SbusL + chnclear SbusR + xout aL, aR +endop + + + + +#end diff --git a/BUG9/instruments.udo b/BUG9/instruments.udo new file mode 100644 index 0000000..198d196 --- /dev/null +++ b/BUG9/instruments.udo @@ -0,0 +1,179 @@ +#ifndef UDO_INSTRUMENTS +#define UDO_INSTRUMENTS ## +/* + Debugger - Unfixed Bugs : BUG #8 + + Sound generators + Names should correspond to those used in BID file, prepended with play_ +*/ + + +#include "wavetables.udo" +#include "bussing.udo" +#include "bid.udo" + + +instr play_bass + iamp = bid_getparameter(p4, p5, 2) + ifreq = cpsmidinn(table(1, gibid_chordfn, 0, 0, 1) - 48) + k1 linseg 2.1, p3*0.2, 2, p3*0.8, 2 + k2 line 10, p3, 0 + kamp linseg 1, p3*0.1, 0.6, p3*0.9, 0 + aL foscil 1, ifreq, 4, k1, k2, gifnSine + aR foscil 1, ifreq, 3.9, k1, k2, gifnSine + aL pareq aL*1.3, 200, 0.3, 0.7 + aR pareq aR*1.3, 200, 0.3, 0.7 + bus_mix("master", aL*kamp*iamp, aR*kamp*iamp) +endin + +instr play_mel1 + iamp = bid_getparameter(p4, p5, 2) + ifreq = cpsmidinn(table(random(1, 4), gibid_chordfn, 0, 0, 1) + 12) + kamp init 1 + aL wgbowedbar 1, ifreq, 0.5, 0.2, 0.995 + aR wgbowedbar 1, ifreq, 0.3, 0.5, 0.995 + bus_mix("master", aL*kamp*iamp, aR*kamp*iamp) +endin + +instr play_mel2 + iamp = bid_getparameter(p4, p5, 2) + ifreq = cpsmidinn(table(random(1, 4), gibid_chordfn, 0, 0, 1) - 12) + k1 linseg 1.1, p3*0.2, 2, p3*0.8, 2 + k2 line 1, p3, 6 + kamp linseg 1, p3*0.1, 0.6, p3*0.9, 0 + aL foscil 1, ifreq, 4, k1, k2, gifnSine + aR foscil 1, ifreq, 3.9, k1, k2, gifnSine + aL pareq aL, 200, 0.3, 0.7 + aR pareq aR, 200, 0.3, 0.7 + bus_mix("master", aL*kamp*iamp, aR*kamp*iamp) +endin + +/* + clap +*/ +gifnClap ftgen 0, 0, 1024, 7, 1, 128, 0, 1, 0.9, 128, 0, 1, 0.8, 128, 0, 1, 0.7, 128, 0, 1, 0.5, 256, 0.1, 256, 0 +instr play_clap + iamp = bid_getparameter(p4, p5, 2) + p3 = 0.25 + kbetaL line 0.9, p3, 0.01 + kbetaR line 0.8, p3, 0.01 + aL noise 1, kbetaL + aR noise 1, kbetaR + kfreqL line 700+random(-100, 100), p3, 2500+random(-100, 100) + kfreqR line 700+random(-100, 100), p3, 2500+random(-100, 100) + + apt oscil 1, line(50, p3, 2000) + apt2 oscil 1, line(500, p3, 20) + + aL *= apt * apt2 + aR *= apt * apt2 + aL butterbp aL, kfreqL, 1000 + aR butterbp aR, kfreqR, 1000 + + kndx phasor 1/p3 + kamp tab kndx, gifnClap, 1 + kamp *= linseg(1, p3*0.5, 0.2, p3*0.5, 0) * iamp * 8 + aL *= kamp + aR *= kamp + bus_mix("master", aL, aR) +/* + p3 = 0.03 + kbt linseg 0.5, p3, -0.5 + aL noise 1, kbt + aR noise 1, kbt+0.1 + kbpf linseg 1500, p3, 100 + kbnp linseg 800, p3, 100 + aL butterbp aL, kbpf, kbnp + aR butterbp aR, kbpf, kbnp + aL taninv aL*7 + aR taninv aR*7 + + kamp linseg 1, p3*0.1, 0.3, p3*0.1, 0.9, p3*0.1, 0.3, p3*0.1, 0.8, p3*0.1, 0.2, p3*0.1, 0.7, p3*0.4, 0 + kamp2 = abs(oscil(0.5, 4)) + 0.5 + aL *= kamp * iamp + aR *= kamp * iamp + bus_mix("delay2", aL, aR) + bus_mix("master", aL, aR) + */ +endin + + +/* + Closed lower frequency hi-hat +*/ +instr play_hat1 + iamp = bid_getparameter(p4, p5, 2) + idel = random(0.001, 0.02) + xtratim idel + p3 = random(0.01, 0.04) + ifreq = 200 + aenv expsega .1, .0005, 1, p3 - .0005, .01 + asqr1 oscil 1, ifreq, gifnSaw, -1 + asqr2 oscil 1, ifreq*1.4471, gifnSquare, -1 + asqr3 oscil 1, ifreq*1.6170, gifnSaw, -1 + asqr4 oscil 1, ifreq*1.9265, gifnSaw, -1 + asqr5 oscil 1, ifreq*2.5028, gifnSaw, -1 + asqr6 oscil 1, ifreq*2.6637, gifnSaw, -1 + a808L sum asqr1, asqr2, asqr3, asqr4, asqr5, asqr6 + a808L butterhp a808L, 4270 + ;a808L butterhp a808L, 4270 + aoutL = a808L * aenv * iamp + aoutL delay aoutL, idel + + asqr1 oscil 1, ifreq, gifnSaw, -1 + asqr2 oscil 1, ifreq*1.3471, gifnSaw, -1 + asqr3 oscil 1, ifreq*1.6470, gifnSaw, -1 + asqr4 oscil 1, ifreq*1.8765, gifnSaw, -1 + asqr5 oscil 1, ifreq*2.4028, gifnSaw, -1 + asqr6 oscil 1, ifreq*2.5637, gifnSaw, -1 + a808R sum asqr1, asqr2, asqr3, asqr4, asqr5, asqr6 + a808R butterhp a808R, 4270 + ;a808L butterhp a808L, 4270 + aoutR = a808R * aenv * iamp + aoutR delay aoutR, idel + bus_mix("master", aoutL, aoutR) +endin + + +instr play_hat2 + iamp = bid_getparameter(p4, p5, 2) + idel1 = random(0.005, 0.02) + idel2 = random(0.005, 0.02) + xtratim(max:i(idel1, idel2)) + kfreq = abs(oscil(50, 10)) + 800 + aenv expsega .1, .0005, 1, p3 - .0005, .01 + asqr1 oscil 1, kfreq, gifnSquare, -1 + asqr2 oscil 1, kfreq*1.4471, gifnSquare, -1 + asqr3 oscil 1, kfreq*1.6170, gifnSquare, -1 + asqr4 oscil 1, kfreq*1.9265, gifnSquare, -1 + asqr5 oscil 1, kfreq*2.5028, gifnSquare, -1 + asqr6 oscil 1, kfreq*2.6637, gifnSquare, -1 + a808 sum asqr1, asqr2, asqr3, asqr4, asqr5, asqr6 + a808 butterhp a808, 3270 + a808 butterhp a808, 3270 + aout = a808 * aenv * iamp * 0.64 + aL delay aout, idel1 + aR delay aout, idel2 + bus_mix("master", aL, aR) +endin + + + + +/* + Lightly distorted 808 style kick +*/ +instr play_kick + iamp = bid_getparameter(p4, p5, 2) + aout1 wgbowedbar 1, 60, 0.9, 0.1, 0.1 + aout1 distort aout1, 0.25, gifnSquare + aout1 pareq aout1, 130, 0.3, 0.6 + aout1 pareq aout1, 9000, 5, 0.6 + aout1 *= 0.8 + bus_mix("master", aout1, aout1) +endin + + + + +#end diff --git a/BUG9/txt_tools.udo b/BUG9/txt_tools.udo new file mode 100644 index 0000000..d34459e --- /dev/null +++ b/BUG9/txt_tools.udo @@ -0,0 +1,82 @@ +#ifndef UDO_TXTTOOLS +#define UDO_TXTTOOLS ## +/* + Debugger - Unfixed Bugs : BUG #4 + + Text tools +*/ + + +/* + Print a notification prepended with a line of asterisks + + tt_notify Stext + + Stext text to print +*/ +opcode tt_notify, 0, S + Stext xin + Snew = "\n" + iwidth = 60 + index = 0 + while (index < iwidth) do + Snew = strcat(Snew, "*"); + index += 1 + od + prints strcat(strcat(Snew, "\n"), strcat(Stext, "\n\n")) +endop + + + +/* + Print a notification prepended with a line of asterisks and exit + + tt_notify Stext + + Stext text to print +*/ +opcode tt_notify_fatal, 0, S + Stext xin + tt_notify(Stext) + exitnow +endop + + +/* + Return a number of seconds as HH:MM:SS format + + Stime tt_parsetime iseconds + + iseconds seconds to parse + + Stime formatted time + +*/ +opcode tt_parsetime, S, i + input xin + ihours = floor(input / 3600) + iminutes = floor((input - (ihours * 3600)) / 60) + iseconds = input - (ihours * 3600) - (iminutes * 60) + xout sprintf("%02d:%02d:%05.2f", ihours, iminutes, iseconds) +endop + + +/* + Strip newline from end of line: built-in opcode has some problems + + Soutput tt_stripnewline Sinput + + Soutput processed without newline at end if existent + + Sinput line to process +*/ +opcode tt_stripnewline, S, S + Sline xin + index = strindex(Sline, "\n") + if (index != -1) then + Sline = strsub(Sline, 0, index) + endif + xout Sline +endop + +#end diff --git a/BUG9/wavetables.udo b/BUG9/wavetables.udo new file mode 100644 index 0000000..82b0552 --- /dev/null +++ b/BUG9/wavetables.udo @@ -0,0 +1,16 @@ +#ifndef UDO_WAVETABLES +#define UDO_WAVETABLES ## +/* + Debugger - Unfixed Bugs : BUG #4 + + General waveforms +*/ + +ipoints = 16384 +gifnCosine ftgen 0, 0, ipoints, 9, 1, 1, 90 +gifnSine ftgen 0, 0, ipoints, 10, 1 +gifnSquare ftgen 0, 0, ipoints, 10, 1, 0, 0.3, 0, 0.2, 0, 0.14, 0, .111 +gifnSaw ftgen 0, 0, ipoints, 10, 0, .2, 0, .4, 0, .6, 0, .8, 0, 1, 0, .8, 0, .6, 0, .4, 0, .2 + +#end + |