Foxdot Documentation: Release 0.5.9
Foxdot Documentation: Release 0.5.9
Release 0.5.9
Ryan Kirkbride
1 Contents 3
1.1 Guides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
i
ii
FoxDot Documentation, Release 0.5.9
FoxDot is a Python library and programming environment that provides a fast and user-friendly abstraction to the
powerful audio-engine, SuperCollider. It comes with its own IDE, which means it can be used straight out of the box;
all you need is Python and SuperCollider and you’re ready to go!
For more information on installation, check out the Installation Guide, or if you’re already set up, you can also find a
useful Getting Started guide that introduces the key components of FoxDot.
If you still need help, check out the FAQ, or you can drop by the #foxdot channel on slack, drop by the discussion
board, or file a bug in the issue tracker. Please let us know where you think this documentation can be improved.
Contents: 1
FoxDot Documentation, Release 0.5.9
2 Contents:
CHAPTER 1
Contents
1.1 Guides
This section contains a couple of walkthroughs that will help you get familiar with FoxDot. If you’re new to Foxdot,
you’ll want to begin with the Getting Started guide.
Downloads
Installing
Follow the installation instructions for your downloads of Python and SuperCollider. When installing Python, click
yes when asked if you want to add Python to your system path and yes if you want to install pip – this is used for
automatically downloading/installing Python libraries such as FoxDot.
Install the latest version of FoxDot from the Python Package Index using pip from your command line (command
prompt in Windows, terminal in MacOS and Linux) by executing:
Alternatively, you can build from the source on GitHub and keep up to date with the development version:
3
FoxDot Documentation, Release 0.5.9
Open SuperCollder and install the FoxDot Quark (this allows FoxDot to communicate with SuperCollider – requires
Git to be installed on your machine) by entering the following in the editor and pressing Ctrl+Return which “runs” a
line of code:
Quarks.install("FoxDot")
Recompile the SuperCollider class library by going to Language -> Recompile Class Library or pressing Ctrl+Shift+L.
If you don’t have Git installed, you can download an install the necessary SuperCollider Quarks directly from GitHub
by running the 2 lines of code below in SuperCollider:
Quarks.install("https://github.com/Qirky/FoxDotQuark.git")
Quarks.install("https://github.com/supercollider-quarks/BatLib.git")
Startup
Open SuperCollider and evaluate the following (this needs to be done before opening FoxDot):
FoxDot.start
SuperCollider is now listening for messages from FoxDot. To start FoxDot from the command line just type:
python -m FoxDot
The FoxDot interface should open up and you’re ready to start jamming! Check out the Getting Started guide for some
useful tips on getting to know the basics of FoxDot. Happy coding!
The SC3 Plugins are a collections of classes that extend the already massive SuperCollider library. Some of these are
used for certain “effects” in FoxDot (such as bitcrush) and will give you an error in SuperCollider if you try to use them
without installing the plugins. The SC3 Plugins can be downloaded from here. Once downloaded place the folder into
your SuperCollider “Extensions” folder and then restart SuperCollider. To find the location of the “Extensions” folder,
open SuperCollider and evaluate the following line of code:
Platform.userExtensionDir
This will display the location of the “Extensions” folder in the SuperCollider “post window”, usually on the right
hand side of the screen. If this directory doesn’t exist, just create it and put the SC3 plugins in there and restart
SuperCollider. When you next open FoxDot, go to the “Language” drop-down menu and tick “Use SC3 Plugins”.
Restart FoxDot and you’re all set!
If you are having trouble installing the FoxDot Quark in SuperCollider, it’s usually because the version of SuperCol-
lider you are installing doesn’t have the functionality for installing Quarks or it doesn’t work properly. If this is the
case, you can download the contents of the following SuperCollider script: foxdot.scd. Once downloaded, open the
file in SuperCollider and press Ctrl+Return to run it. This will make SuperCollider start listening for messages from
FoxDot.
4 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
Installing on Linux
Much of the installation (including Python & SuperCollider) has been automated into a simple shell script written by
Noisk8. You can download the Linux Install script from their GitHub which contains some information on what the
script is doing and how to run it. (note: it is in Spanish but modern web browsers will translate that for you)
For more answers to other frequently asked questions, check out the FAQ post on the discussion forum.
Please report any issues or bugs on the project’s GitHub or if you have any questions, feel free to leave a message on
the discussion forum.
help(object)
FoxDot provides a Python interface to SuperCollider – mainly as a quick and easy to use abstraction for SuperCollider
classes, Pbind and SynthDef. Please read the SuperCollider documentation if you’d like to know more.
A SynthDef is essentially your digital instrument and FoxDot creates players that use these instruments with your
guidance. To execute code in FoxDot, make sure your text cursor is in the ‘block’ of code (sections of text not
separated by blank lines) and press Ctrl+Return. The output of any executed code is displayed in the console in
the bottom half of the window.
Try print(2+2) and see what you get.
Now try something that spans multiple lines:
for n in range(10):
sq = n*n
print(n, sq)
1. Player Objects
It is, in fact, possible to create SuperCollider SynthDefs using FoxDot, but that’s outside of the scope of this starter
guide. To have a look at the existing (but quite small, unfortunately) library of FoxDot SynthDefs, just execute:
print(SynthDefs)
Choose one and create a FoxDot player object using the double arrow syntax like in the example below. If my chosen
SynthDef was “pluck” then I could create an object “p1”:
p1 >> pluck()
To stop an individual player object, simply execute p1.stop(). To stop all player objects, you can press Ctrl+.,
which is a shortcut for the command Clock.clear().
The >> in Python is usually reserved for a type of operation, like + or -, but it is not the case in FoxDot, and the reason
will become clear shortly. If you now give your player object some arguments, you can change the notes being played
1.1. Guides 5
FoxDot Documentation, Release 0.5.9
back. The first argument, the note degree, doesn’t need explicit naming, but you’ll need to specify whatever else you
want to change – such as note durations or amplitudes.
These keyword arguments relate to the corresponding SynthDef (“pluck” in this case) but with a few exceptions:
• degree
• dur
• scale
• oct
These are used by FoxDot to calculate the frequencies of notes to be played and when to play them. You can view the
SuperCollider code (although not easy to read) by executing print(pluck) for example. You can group together
sounds by putting multiple values within an argument in round brackets like so:
Notice how you don’t need to put single values in square brackets? FoxDot takes care of that for you. You can even
have a Player Object follow another!
Sound samples can also be played back using the Sample Player object, which is created like so:
d1 >> play("x-o-")
Each character refers to a different audio file. To play samples simultaneously, simply create a new player object:
d1 >> play("xxox")
hh >> play("---(-=)", pan=0.5)
Characters in round brackets are alternated in each loop (know as lacing) such that the above player, hh, would be
writtern literally as hh >> play('-------=') which save you a lot of typing! Putting characters in square
brackets will play them twice as fast and can be put in round brackets as if they were one character themselves. Try it
out:
d1 >> play("x[--]o(=[-o])")
2. Patterns
Player Objects use Python lists, known more commonly as arrays in other languages, to sequence themselves. You’ve
already used these previously, but they aren’t exactly flexible for manipulation. For example, try multiplying a list by
two like so:
print([1, 2, 3] * 2)
Is the result what you expected? If you want to manipulate the internal values in Python you have to use a for loop:
l = []
for i in [1, 2, 3]:
l.append(i * 2)
print(l)
6 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
or list comprehension:
print([i*2 for i in [1,2,3]])
But what if you want to multiply the values in a list by 2 and 3 in an alternating way? That requires quite a lot of
messing around actually, especially if you don’t know what values you’ll be using. FoxDot uses a container type called
a ‘Pattern’ to help solve this problem. They act like regular lists but any mathematical operation performed on it is
done to each item in the list and done so pair-wise if using a second pattern. The base Pattern can be created like so:
print(P[1,2,3] * 2)
>>> P[2, 4, 6]
print(P[1,2,3] + [3,4])
>>> P[4, 6, 6, 5, 5, 7]
Notice how in the second operation, the output consists of all the combinations of the two patterns i.e. [1+3, 2+4,
3+3, 1+4, 2+3, 3+4].
• Try some other mathematical operators and see what results you get.
• What happens when you group numbers in brackets, like P[1,2,3] * (1,2)?
There are several other Pattern classes in FoxDot that help you generate arrays of numbers but also behave in the
same way as the base Pattern. We’ll just look at two types here, but execute print(classes(Patterns.
Sequences)) to see what others exist and have a go at using them.
In Python, you can generate a range of integers with the syntax range(start, stop, step). By default, start is
0 and step is 1. You can use PRange(start, stop, step) to create a Pattern object with the equivalent values:
print(range(10))
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(PRange(10))
>>> P[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(PRange(10) * [1, 2]) # Pattern class behaviour
>>> P[0, 2, 2, 6, 4, 10, 6, 14, 8, 18]
But what about combining patterns? In Python, you can concatenate two lists (append one to another) by using the +
operator but FoxDot Patterns use this to perform addition to the data within the list. To connect two Pattern objects
together, you can use the pipe symbol, |, which Linux users might be familiar with – it is used to connect command
line programs by sending output from one process as input to another.
print(PRange(4) | [1,7,6])
>>> P[0, 1, 2, 3, 1, 7, 6]
FoxDot automatically converts any object being piped to a Pattern to the base Pattern class so you don’t have to worry
about making sure everything is the right type. There exists several types of Pattern sequences in FoxDot (and the list
is still growing) that make generating these numbers a little easier. For example, to play the first octave of a pentatonic
scale from bottom to top and back again, you might use two PRange objects:
p1 >> pluck(PRange(5) | PRange(5,0,-1), scale=Scale.default.pentatonic)
3. TimeVars
A TimeVar is an abbreviation of “Time Dependent Variable” and is a key feature of FoxDot. A TimeVar has a series
of values that it changes between after a pre-defined number of beats and is created using a var object with the syntax
1.1. Guides 7
FoxDot Documentation, Release 0.5.9
var([list_of_values],[list_of_durations]). Example:
When a TimeVar is used in a mathematical operation, the values it affects also become TimeVars that change state
when the original TimeVar changes state – this can even be used with patterns:
a = var([0,3], 4)
print(a + 5) # beat = 0
>>> 5
print(a + 5) # beat = 4
>>> 8
b = PRange(4) + a
print(b) # beat = 8 and a has a value of 0
>>> P[0, 1, 2, 3]
print(b) # beat = 12 and a has a value of 3
>>> P[3, 4, 5, 6]
1.2 References
8 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
1.2.1 FoxDot
FoxDot package
Subpackages
FoxDot.lib package
Subpackages
FoxDot.lib.Code package
Submodules
FoxDot.lib.Code.foxdot_func_cmp module
FoxDot.lib.Code.foxdot_live_function module
FoxDot.lib.Code.foxdot_tokenize module
FoxDot.lib.Code.foxdot_when_statement module
FoxDot.lib.Code.main_lib module
Module contents
FoxDot.lib.GhostCoder package
Submodules
FoxDot.lib.GhostCoder.Grammar module
# TODO: Fixme
#.. automodule:: FoxDot.lib.GhostCoder.Grammar
members
undoc-members
show-inheritance
FoxDot.lib.GhostCoder.Writer module
# TODO: Fixme
#.. automodule:: FoxDot.lib.GhostCoder.Writer
members
undoc-members
1.2. References 9
FoxDot Documentation, Release 0.5.9
show-inheritance
Module contents
# TODO: Fixme
#.. automodule:: FoxDot.lib.GhostCoder
members
undoc-members
show-inheritance
10 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
1.2. References 11
FoxDot Documentation, Release 0.5.9
FoxDot.lib.Patterns package
Submodules
FoxDot.lib.Patterns.Generators module
FoxDot.lib.Patterns.Main module
FoxDot.lib.Patterns.Operations module
FoxDot.lib.Patterns.PGroups module
FoxDot.lib.Patterns.Parse module
FoxDot.lib.Patterns.PlayString module
FoxDot.lib.Patterns.Sequences module
FoxDot.lib.Patterns.Utils module
Module contents
FoxDot.lib.SCLang package
Submodules
FoxDot.lib.SCLang.Env module
FoxDot.lib.SCLang.SCLang module
FoxDot.lib.SCLang.SynthDef module
Module contents
FoxDot.lib.Settings package
Submodules
FoxDot.lib.Settings.conf module
Module contents
FoxDot.lib.Utils package
Module contents
FoxDot.lib.Workspace package
12
Submodules Chapter 1. Contents
FoxDot.lib.Workspace.AppFunctions module
FoxDot Documentation, Release 0.5.9
FoxDot.lib.OSC3 module
# TODO: Fixme
#.. automodule:: FoxDot.lib.OSC3
members
undoc-members
show-inheritance
FoxDot.lib.Players module
FoxDot.lib.Repeat module
FoxDot.lib.Root module
FoxDot.lib.Scale module
FoxDot.lib.ServerManager module
FoxDot.lib.TempoClock module
FoxDot.lib.TimeVar module
Module contents
Module contents
1.3 Changelog
1.3. Changelog 13
FoxDot Documentation, Release 0.5.9
• Fix TimeVar class so it no longer inherits from Repeatable i.e. no longer has access to the “every” method.
• Fix pattern bug when creating a pattern using the P generator; P[P(0,2)] no longer returns P[0, 2].
However, P[(0,2)] is interpreted exactly as P[0, 2] and will return that instead.
• Added more variation to the “formantFilter” effect
• “loop” samples are added “on-the-fly” as opposed to loaded at start up. These can be loaded by filepath (with or
without extension):
a1 >> loop("/path/to/sample.wav")
a2 >> loop("/path/to/sample")
• Better communication from external processes. Running FoxDot with a --pipe flag (e.g. python -m
FoxDot --pipe) allows commands to be written via the stdin. Each command should end with a blank
line.
• Player attribute aliases added. Using pitch and char will return a player’s degree attribute.
• Player Key behaviour improved. Using multiple conditions e.g. 4 < p1.pitch < 7 will hold the value 1
while p1.pitch is between 4 and 7, and a 0 otherwise. These conditions can be “mapped” to values other than
1 by using the map method to map values, or results of functions, to other values/functions (which are applied
to the values):
b1 >> bass(var([0,4,5,3]))
# Takes a dictionary of values / functions
p1 >> pads(b1.pitch.map(
{ 0: 2,
4: lambda x: x + P(0,2),
lambda x: x in (5,3): lambda y: y + PRand([0,2,4,7])
}))
• Known issue: mapping to a pattern of values for a Player’s duration does not work as expected so be careful.
• The Player.every method can now take Pattern methods, which affect the degree of the Player (spec-
ifying attributes will be added later). Instead of applying the function every time it is called, it has a switch that
applies the function then “un-applies” the function.
14 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
• Improved behaviour of TimeVar, Pvar, and PvarGenerator classes when created via mathematical oper-
ators.
• SynthDefs can be read loaded into FoxDot from SuperCollider using the FileSynthDef and
CompiledSynthDef classes (see SynthDef.py).
• DefaultServer instance has a forward attribute that, when not None, sends any outgoing OSC message
to. Example:
• Pattern “zipping” behaviour changed. A PGroup within a sequence is extended when zipped with another
instead of nesting it. e.g.
# Old style
>>> P[(0,1),(2,3)].zip([(4,5)])
P[P(0, 1, P(4, 5)), P(2, 3, P(4, 5))]
# New style
>>> P[(0,1),(2,3)].zip([(4,5)])
P[P(0, 1, 4, 5), P(2, 3, 4, 5)]
• Consequently, sample player strings can use the <> arrows to play multiple sequences together using one string.
• To use a different sample value for each pattern use a group of values as in the example above. Each value in
relates to each pattern e.g. the “x” used sample 0, the “o” pattern uses sample 1 and the “-” pattern uses sample
2. If you want to use multiple values just use a group within a group:
• Network synchronisation introduced! This is still quite a beta feature and feedback would be appreciated if you
come across any issues. Here’s how to do it:
• To connect to another instance of FoxDot over the network you need one user to be the master clock. The master
clock user needs to go from the menu to “Language” then “Listen for connections”. This will start listening for
connections from other FoxDot instances. It will print the IP address and port number to the console; give this
information to your live coding partner. They need to run the following code using the IP address on the master
clock machine:
Clock.connect("<ip address>")
• This will copy some data, e.g. tempo, from the master clock and also adjust for the differences in local machine
time (if your clocks are out of sync). The latter will depend on the latency of the connection between your
machines. If you are out of time slightly, set the Clock.nudge value to a small value (+-0.01) until the clocks
are in sync. Now whenever you change the Clock.bpm value, the change will propagate to everyone on the
next bar.
1.3. Changelog 15
FoxDot Documentation, Release 0.5.9
• Pattern getitem method now allows Patterns to be indexed using a Player Key e.g. P[0,1,2,3][p1.
degree] that will return the item in the Pattern based on the integer values of the key (p1.degree in this
example).
• Added future method. Like schedule it adds a callable object to the queue but doesn’t need the exact
beat occurrence, just how many beats in the future from “now”. First argument is time, followed by the object,
arguments, and keyword arguments.
• Player object stop method properly removes the player from Clock.playing list.
• Using Player Key __getitem__ returns a player key whose calculation function is __getitem__. This is
useful if you want to use just one of the values of another player if they are in a group. e.g.
• SuperCollider bus number resets to 4 instead of 1 to prevent feedback loops when using reverb.
• Changed “verb” keyword to “mix” for reverb effect. Default is changed from 0.25 to 0.1.
• GeneratorPattern new method converts the other argument to a Pattern so you can use lists/tuples as
opposed to just Patterns/PGroups when performing operations e.g. PWalk() + (0,4).
• Fixed newline method to only add an indent if the INSERT index was in brackets or following a colon instead
of doing so if the line had open brackets / colon. Evaluated code no longer highlights any empty preceeding
lines.
• Python 3 uses xrange as range
• Moved demo files into main package to fix install from pip.
• Fix group_modi function to test for TimeVar instances instead of trying and failing to index their contents
so that TimeVar’s with strings in their contents don’t get into an infinite recursive call.
16 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
• Fixed issues with indexing GeneratorPattern and using var in Player methods.
• Random GeneratorPattern objects, such as PRand can take a seed keyword that will give you the same
sequence of values for the same value of seed (must be an integer).
• Unsaved work is stored in a temporary filed that can be loaded on the next startup.
• Player objects can now take tuples as an argument, which delays the next event (similar to the delay argument
but works with the following event):
# The Player object uses the smallest duration in the tuple to move to the next
˓→event
• Pattern function PRhythm takes a list of single durations and tuples that contain values that can be supplied to
the PDur e.g.:
# The following plays the hi hat with a Euclidean Rhythm of 3 pulses in 8 steps
d1 >> play("x-o-", dur=PRhythm([2,(3,8)]))
1.3. Changelog 17
FoxDot Documentation, Release 0.5.9
• FoxDot is now Python 3 compatible, so make sure you treat your print statements as functions i.e. use
print("Hello, World!")
• Added audioin SynthDef for processing audio from the default recording device.
• Fixed bugs relating to chaining multiple every methods and ending their call cycle when the parent player is
stopped
• Improved flexibility of referencing player attributes e.g.
• FoxDot is now Python 3 compatible, so make sure you treat your print statements as functions i.e. use
print("Hello, World!")
• Nested pattern bug fixed so that they no longer cause patterns to loop
• Improved clock scheduling after proper “latency” implementation
• Added a new SynthDef, loop, to play longer samples:
p1 >> loop("billions")
# The second argument is the starting point in beats such that the following 2
˓→lines are equivalent
• Added ability to use the lambda symbol in place of the word lambda. Insert it by using Ctrl+L.
• Put slide, slidefrom, coarse, pshift into their own effects
• Any delay or stutter behaviour in Players is now handed over to SuperCollider by timestamping the OSCBundle,
which should make FoxDot a lot more efficient & removed send_delay and func_delay classes.
• Using a TimeVar in a pattern function, such as PDur, now creates a time-varying pattern as opposed to a
pattern that uses the TimeVar’s current value. e.g.
18 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
• Adding values to a player performs the whole operation as opposed to adding each value in turn when the
Player is called. This improves efficiency when using data structures such as TimeVar``s as it only
creates a new once ``TimeVar when the addition is done.
• Improved usability of PlayerKey class, accessed when get the attribute of a Player e.g. p1.degree.
• Sleep time set to small value. 0 sleep time would crash FoxDot on startup on some systems.
• Made the behaviour of the every method more consistent rather than just starting the cycle at the next bar.
• In addition to P*, P+, P/, and P** have been added. P+ refers uses the sustain values in a player to derive its
delay. P/ delays the events every other time it is accessed, and P** shuffles the order the values are delayed.
• Added PWalk generator pattern.
• TimeVars are easier to update once created.
# Reassigning a var to a named var updates the values instead of creating a new
˓→var
var.foo = var([2,3,4,5],2)
• Removed sleep from scheduling clock loop to increase performance. If you want to decrease the amount of
CPU FoxDot uses, change the sleep duration to a small number around 0.001 like so
Clock.sleep_time = 0.001
• Added pitch shift (pshift) to Sample Players, which increases the pitch of a sample by the number of semi-
tones. You can use Scale.default.semitones() to generate semitones from the current scale.
• Added a new Pattern type data structure called a P-Star or P*. It is a subclass of PGroup but it has a
“behaviour” that effects the current event of Player object, which, in this instance, adds a delay to each value
based on the current Player’s duration. e.g.
# Plays the first note, 0, for 4 beats then the pitches 2, 4, and 6 at 4/3 beats
˓→each.
1.3. Changelog 19
FoxDot Documentation, Release 0.5.9
• Frequency and buffer number calculation is done per OSCmessage which means these values can be modified
in any delayed message i.e. when using the Player stutter method like so:
• Using as linvar as the Clock tempo will no longer crash the Clock.
• New effects have been added; shape which is a value between 0 and 1 (can be higher) that relates to a level of
distortion, and formant which is a value between 0 and 8 and applies different formant filters to the audio.
• hpf and lpf have resonance values now: hpr and lpr
• You can open the config file directly from FoxDot by using the “Help & Settings” menu. Likewise you can open
the directory that holds where your samples are kept. This can be changed in the config file.
• PlayerKey data type can handle PGroup transformations without crashing, which improves performance
when using follow
• PlayerKey data type greater than and less than functions fixed and now works with amplitudes.
• Better handling of scheduled functions that are “late”
• Experimental: play SynthDef can have a rate of -1 to be played in reverse and also uses a keyword coarse
similar in function to chop
• Added Pattern method, palindrome that appends a mirrored version of the pattern to itself.
• Removed visual feedback for shuffling, rotating, etc patterns in Players as it did not work correctly with nested
patterns.
• TempoClock uses a start_time value that, when used on multiple instances of FoxDot, should synchronise
the timings. This is a work in progress
• Added a “use SC3 Plugins” tick-box on the “Code” drop down menu to allow for easier configuration
• piano SynthDef added using th SC3 Plugin “MdaPiano”
• var type can be used with Player delay and nested groups in the oct attribute.
• Increased TempoClock latency to 0.2 seconds for improved performance.
• Better handling for auto-completed quotation marks
20 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
• New nested PGroup behaviour added for players. Each value in each PGroup in an event relates to the values
in any other PGroup in the same index, even if that value is also a PGroup. This concept is better described
through an example:
• The first note, 0, is played with a pan of 0, chop of 0, and with no vibrator added. The second note, 2, is played
with a chop of 4 and with no vibrato with a pan of -1 (left) but with a vibrato value of 12 with a pan of 1 (right).
• Experimental: Players can “follow” other Players’ attributes over time by referencing their attributes.
1.3. Changelog 21
FoxDot Documentation, Release 0.5.9
• Effects are now implemented using busses on SuperCollider, which uses less CPU
• Effects can be customised and defined
• Sample Player behaviour (i.e. how the string of characters relates to playback) has been altered. Square brackets
refer to a single event even though two samples are played.
• SuperCollider is booted on startup with a compiled startup file.
22 Chapter 1. Contents
FoxDot Documentation, Release 0.5.9
• PSparse pattern type added (all Pattern names can be seen by executing print(PatternTypes)
• Major overhaul of Pattern nesting/lacing behaviour. Patterns can now be nested to multiple levels.
• Player object attributes now ‘follow’ one another and their current values are examined instead of the Pattern
value
1.3. Changelog 23
FoxDot Documentation, Release 0.5.9
• Removed RegEx find and replace >> and $ syntax. FoxDot now uses pure Python code and saved files can be
run by themselves.
24 Chapter 1. Contents
CHAPTER 2
• genindex
• modindex
• search
25