-
Notifications
You must be signed in to change notification settings - Fork 3
Home
What is Gibberwocky for Max?
A quick way to augment a Max patcher with live coded sequencing & modulations. Live coding happens in a browser-based text editor, following similar idioms as in the widely-used Gibber environment. Modulations can be messages, UI knob tweaks, and even arbitrary signal graphs.
Open Max's Package Manager, find & install the gibberwocky
package
Alternatively, download/checkout https://github.com/gibber-cc/gibberwocky.max into Documents/Max 8/Packages
(or My Documents/Max 8/Packages
on windows)
Make sure you have a recent version of Chrome (or Firefox or Safari (or maybe even Edge now)).
Add a [gibberwocky]
object to your Max patcher. Turn on audio in the patcher, if it isn't already on.
Send the [gibberwocky]
object a bang
to open the editor (alternatively, just open http://gibberwocky.cc/burble in your browser). In the editor's console, if it says "gibberwocky.max is ready to burble", you're all set!
Note: You might need to open port 8081 on your firewall.
Gibberwocky -> Max
-
message
=> messages/lists from [gibberwocky] 1st outlet -
param
=> messages to UI objects with scripting names -
device
=> messages to device objects (including sending midinotes and setting parameters) -
signal
=> audio outlets of [gibberwocky]
message("hello")("world")
...will send the message hello world
out of the gibberwocky 1st outlet. So will:
message("hello.world")
A message path of this kind can also be stored as an callable object, for re-use:
hello = message("hello")
hello("world")
// alternate filter cutoff between 100Hz and 10kHz every beat:
devices['synth']['cutoff'].seq([100, 10000], 1/4)
// midi note number:
devices['synth'].midinote( 60 )
// midi note number, midi velocity, duration in ms:
devices['synth'].midinote( 60, 120, 1000 )
Note, velocity, and duration can all be sequenced independently:
devices['bass'].midinote.seq( 60, 1/2 )
devices['bass'].velocity.seq( [16, 64, 127], 1/2 )
devices['bass'].duration.seq( [10, 100,500], 1/2 )
You can also specify Euclidean rhythms using the Euclid() function, which returns a pattern:
devices['drums'].midinote.seq( 36, Euclid(5,8) )
Euclidean rhythms are specifcations of rhythm using a number of pulses allocated over a number of beats. The algorithm attempts to distribute the pulses as evenly as possible over all beats while maintaining a grid. Examples of these distributions are given below (where 'x' represents a pulse and '.' represents a rest):
1,4 : x...
2,3 : x.x
2,5 : x.x..
3,5 : x.x.x
3,8 : x..x..x.
5,8 : x.xx.xx.
4,9 : x.x.x.x..
5,9 : x.x.x.x.x
As in Gibber, by default the number of beats chosen also determines the time used by each beat; selecting '5,8' means 5 pulses spread across 8 1/8 notes. However, you can also specify a different temporal resolution for the resulting pattern: '5,8,1/16' means 5 pulses spread across 8 beats where each beat is a 1/16th note.
You can read a paper describing Euclidean rhythms here: http://archive.bridgesmathart.org/2005/bridges2005-47.pdf