FoxDot is a Python programming environment that provides a fast and user-friendly abstraction to SuperCollider. It also 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!
- Moved demo files into main package to fix install from pip.
Player.stop_calling
is nowPlayer.never
. If aPlayer
is calling its own method (implemented by theevery
method e.g.p1 >> pads().every(4, "reverse")
you can now stop the repeated call by usingp1.never("reverse")
.- Fixed circular referencing bug when using PGroups e.g.
p1 >> pads(p1.degree + (0,4))
- Window transparency can now be toggled from the "Edit" menu
- Added Tutorial files that can be loaded from the menu
- Multiple uses of the
every
method with the same method name can be used together by specifying anident
keyword, which can be any hashable value i.e. a string or integer.
# The second "stutter" no longer overrides the first
d1 >> play("x-u-").every(8, "stutter", 8).every(3, "stutter", 4, dur=1, degree="y", ident=1)
- Fix
group_modi
function to test forTimeVar
instances instead of trying and failing to index their contents so thatTimeVar
s with strings in their contents don't get into an infinite recursive call.
- Python 2 or 3 - make sure you say "yes" if you'd like to add Python to your path.
- SuperCollider 3.8 and above
- Open up a command prompt and type
pip install FoxDot
. This will download and install the latest stable version of FoxDot from the Python Package Index if you have properly configured Python. - You can update FoxDot to the latest version if it's already installed by adding
-U
or--upgrade
flag to this command. - Alternatively, you can build from source from directly from this repository:
$ git clone https://github.com/Qirky/FoxDot.git
$ cd FoxDot
$ python setup.py install
- Open SuperCollder and install the FoxDot Quark and its dependencies (this allows FoxDot to communicate with SuperCollider) by entering the following and pressing
Ctrl+Return
(Note: this requires Git to be installed on your machine if it is not already):
Quarks.install("FoxDot")
- Recompile the SuperCollider class library by going to
Language -> Recompile Class Library
or pressingCtrl+Shift+L
- Open SuperCollider and type in
FoxDot.start
and evaluate this line. SuperCollider is now listening for messages from FoxDot. - Start FoxDot by entering
python -m FoxDot
at the command line. - If you have installed the SC3 Plugins, use the "Code" drop-down menu to select "Use SC3 Plugins". Restart FoxDot and you'll have access to classes found in the SC3 Plugins.
- Check out the YouTube tutorials for some in-depth tutorial videos on getting to grips with FoxDot
If you are having trouble installing the FoxDot Quark in SuperCollider, it’s usually because the version of SuperCollider 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.
You can find answers to many frequently asked questions on the FAQ post on the FoxDot discussion forum.
A 'block' of code in FoxDot is made up of consecutive lines of code with no empty lines. Pressing Ctrl+Return
(or Cmd+Return
on a Mac) will execute the block of code that the cursor is currently in. Try print(1 + 1)
to see what happens!
Python supports many different programming paradigms, including procedural and functional, but FoxDot implements a traditional object orientated approach with a little bit of cheating to make it easier to live code. A player object is what FoxDot uses to make music by assigning it a synth (the 'instrument' it will play) and some instructions, such as note pitches. All one and two character variable names are reserved for player objects at startup so, by default, the variables a
, bd
, and p1
are 'empty' player objects. If you use one of these variables to store something else but want to use it as a player object again, or you want to use a variable with more than two characters, you just have to reserve it by creating a Player
and assigning it like so:
p1 = Player()
To stop a Player, use the stop
method e.g. p1.stop()
. If you want to stop all players, you can use the command Clock.clear()
or the keyboard short-cut Ctrl+.
, which executes this command.
Assigning synths and instructions to a player object is done using the double-arrow operator >>
. So if you wanted to assign a synth to p1
called 'pads' (execute print(SynthDefs)
to see all available synths) you would use the following code:
p1 >> pads([0,1,2,3])
The empty player object, p1
is now assigned a the 'pads' synth and some playback instructions. p1
will play the first four notes of the default scale using a SuperCollider SynthDef
with the name \pads
. By default, each note lasts for 1 beat at 120 bpm. These defaults can be changed by specifying keyword arguments:
p1 >> pads([0,1,2,3], dur=[1/4,3/4], sus=1, vib=4, scale=Scale.minor)
The keyword arguments dur
, oct
, and scale
apply to all player objects - any others, such as vib
in the above example, refer to keyword arguments in the corresponding SynthDef
. The first argument, degree
, does not have to be stated explicitly. Notes can be grouped together so that they are played simultaneously using round brackets, ()
. The sequence [(0,2,4),1,2,3]
will play the the the first harmonic triad of the default scale followed by the next three notes.
In FoxDot, sound files can be played through using a specific SynthDef called play
. A player object that uses this SynthDef is referred to as a Sample Player object. Instead of specifying a list of numbers to generate notes, the Sample Player takes a string of characters (known as a "PlayString") as its first argument. To see a list of what samples are associated to what characters, use print(Samples)
. To create a basic drum beat, you can execute the following line of code:
d1 >> play("x-o-")
To have samples play simultaneously, you can create a new 'Sample Player' object for some more complex patterns.
bd >> play("x( x) ")
hh >> play("---[--]")
sn >> play(" o ")
Alternatively you can use PZip
, the zip
method, or the &
sign to create one pattern that does this:
# The following are equivalent
d1 >> play( PZip("x( x) ", "--[--]", " o "))
d1 >> play(P["x( x) "].zip("---[--]").zip(" o "))
# Note that first string is wrapped in a Pattern P[]
d1 >> play(P["x( x) "] & "---[--]" & " o ")
Grouping characters in round brackets laces the pattern so that on each play through of the sequence of samples, the next character in the group's sample is played. The sequence (xo)---
would be played back as if it were entered x---o---
. Using square brackets will force the enclosed samples to played in the same time span as a single character e.g. --[--]
will play two hi-hat hits at a half beat then two at a quarter beat. You can play a random sample from a selection by using curly braces in your Play String like so:
d1 >> play("x-o{-[--]o[-o]}")
You can perform actions like shuffle, mirror, and rotate on Player Objects just by calling the appropriate method.
bd >> play("x o xo ")
# Shuffle the contents of bd
bd.shuffle()
You can schedule these methods by calling the every
method, which takes a list of durations (in beats), the name of the method as a string, and any other arguments. The following syntax mirrors the string of sample characters after 6 beats, then again 2 beats later and also shuffles it every 8 beats.
bd >> play("x-o-[xx]-o(-[oo])").every([6,2], 'mirror').every(8, 'shuffle')
For more information on FoxDot, please see the docs
folder (although largely unwritten). Please note that FoxDot is still in development and is changing all the time. I do my best to keep the website and README up to date but don't always have the time.
- The SuperCollider development community and, of course, James McCartney, its original developer
- PyOSC, Artem Baguinski et al
- Members of the Live Coding community who have contributed to the project in one way or another including, but not limited to, Alex McLean, Sean Cotterill, and Dan Hett.
- Big thanks to those who have used, tested, and submitted bugs, which have all helped improve FoxDot
- Thank you to those who have found solutions for SuperCollider related issues, such as DavidS48
FoxDot's audio files have been obtained from a number of sources but I've lost record of which files are attributed to which original author. Here's a list of thanks for the unknowing creators of FoxDot's sample archive.
- Legowelt Sample Kits
- Game Boy Drum Kit
- A number of sounds courtesy of Mike Hodnick's live coded album, Expedition
- Many samples have been obtained from http://freesound.org and have been placed in the public domain via the Creative Commons 0 License: http://creativecommons.org/publicdomain/zero/1.0/ - thank you to the original creators
- Other samples have come from the Dirt Sample Engine which is part of the TidalCycles live coding language created by Yaxu - another huge amount of thanks.