Releases: Qirky/FoxDot
0.6.3
v0.6.1
- Added functionality to specify samples when using the
play
SynthDef. This can be done from the play string by using the bar character in the form|<char><sample>|
. These can also be patterns:
p1 >> play("|x2|-u-")
p1 >> play("(x )( |x[23]|)u ")
p1 >> play("|x{0123}| u ")
p1 >> play("|[xxxx][23]| u ")
- Improved timing of musical events slightly
- Added ability to set tunings for scales
Scale.default.set("major", tuning=Tuning.just)
Scale.default.set("minor", tuning=Tuning.ET12)
Scale.default.set("mixolyidian", tuning=[0, 1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11])
- You no longer need to specify pattern types in functions used in
PlayerKey.map
. Previously this would have thrown an exception but now does not:
p1 >> pluck([0,1])
p2 >> pluck(p1.pitch.map({1: lambda x: x + (0,2)}))
v0.5.10
v0.5.8
v0.5.8 fixes and updates
- Fixed panning issues on many SynthDefs so
fmod
spreads a signal across 2 channels effectively. - Added the ability to use
Pattern
methods on player attributes when using theevery
method:
d1 >> play("x-o-o", dur=PDur(5,8)).every(4, "rate.offadd", 2)
- Improved
every
to switch pattern methods on/off at the correct time when using a list of durations. - FoxDot UI no longer crashes when saving / closing after using a lambda character.
v0.5.5
- Fixed
TimeVar
class so it no longer inherits fromRepeatable
i.e. no longer has access to the "every" method. - Fixed pattern bug when creating a pattern using the
P
generator;P[P(0,2)]
no longer returnsP[0, 2]
. However,P[(0,2)]
is interpreted exactly asP[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")
a1 >> loop("yeah") # Searches recursively for yeah.(wav|wave|aif|aiff|flac)
a1 >> loop("perc/kick") # Supports directories in the path
a1 >> loop("*kick*", sample=2) # Supports * ? [chars] and [!chars]
a1 >> loop("**/*_Em") # Supports ** as 'recursively all subdirectories'
Pvar behaviour and SynthDef update
- Improved behaviour of
TimeVar
,Pvar
, andPvarGenerator
classes when created via mathematical operators. - SynthDefs can be read loaded into FoxDot from SuperCollider using the
FileSynthDef
andCompiledSynthDef
classes (seeSynthDef.py
). DefaultServer
instance has aforward
attribute that, when notNone
, sends any outgoing OSC message to. Example:
# Sends any OSC message going to SuperCollider to the address
DefaultServer.forward = OSCClient(("localhost", 57890))
Simultaneous sample player patterns and network connectivity
v0.5.0 fixes and updates
- 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.
# This plays three patterns together
d1 >> play("<x >< o[ o]>< -(-=)>", sample=(0,1,2))
- 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:
# Plays the snare drum in both channels at different rates
d1 >> play("<x x>< o >", pan=(0, (-1,1)), rate=(1, (1,.9))
- 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.
Python 3 Update
v0.4 Update README