Home

Awesome

Wulfcode

A Midi live-coding environment for performance or composition

Wulfcode screenshot

Watch demo of basic functionality on YouTube

What is Wulfcode for? Ostensibly live-coding, but it’s dramatically simplified compared to the SuperCollider and Csound-based environments used by the live-coding community proper. It’s an object-oriented, text-based MIDI sequencer with its own syntax, and a repertoire of commands and structures that allow interesting looping motifs and polyrythmic phrases to be easily generated and manipulated on the fly.

To use Wulfcode effectively for live performance, you should:

Using Wulfcode involves creating a Note Object - a string of semitone-increment note pitches from 0-f (in hex - the letters a-f correspond to 10-16) - with a given speed multiplier and transposition command, then running that in sync with an incoming MIDI clock. This usually comes from a DAW in ‘play’ mode, which is also accepting incoming MIDI from Wulfcode so it can play those notes from its own softsynths or sampler devices. Creating a Note Object also involves specifying a channel, so if I have e.g. an Ableton Live set with a synth or a sampler on channels 1 to 10, I can target a Note Object at channel 3 by typing and evaluating the following:

mynoteobject c3 {0.23-7c-} 12 0

‘mynoteobject’ is a unique name for the Note Object and is used to refer to this NO in future. Anything can be used, as long as it doesn’t contain special characters (alphanumeric only) and doesn’t clash with one of the other Wulfcode commands (which can be displayed in the message area by typing and evaluating ‘help’). ‘c3’ targets channel 3, the dot in the note string causes a noteoff (the previous note is suddenly killed) while the hyphen causes a rest or sustained note - the previous note is allowed to ring out. ‘12’ is the speed multiplier relative to the incoming BPM; as a reference, 12 gives 8 quavers to a 4/4 bar at 128bpm, while 6 gives 16 semiquavers (much faster) and 24 gives 4 crotchets (slower) in the same. Hopefully that makes sense. This means that Wulfcode, while being as tied to regular beats as most electronic music tools, is largely time-signature agnostic and can run Note Objects with different speeds, counter-rhythms or triplet timings simultaneously.

Evaluating: this is how a command is run. After typing a command on a single, blank line, press Ctrl+1 or Cmd+1 to send the command to the interpreter. The command will remain in place, and you can keep selecting it and reevaluating it - perhaps after tweaking it a little - or you can copy and paste it to a textfile for later use. You can leave commands (or messages/reminders to yourself) lying around wherever you like in the text entry box; no harm is caused as long as they’re not on a line that contains a command you want to run. You can run multiple commands on a line if you separate them with a semicolon and a trailing space, e.g.:

hoof mynoteobject; unmute mynoteobject

This is good for setting up a Note Object but immediately muting it, then tweaking it further before unmuting it back into the mix. You can also run multiple longer commands simultaneously by selecting multiple lines and evaluating, e.g.:

mynoteobject c0 {0237a3------} 12 0
mynoteobject c0 {------ac75a7} 12 -12

if selected and evaluated will run a seamless 12-note sequence on the same MIDI channel from two Note Objects.

What's new in v0.2-beta.3

Running:

When there's a .jar available, Mac users should first copy wulfcode_config.txt to their home directory and then run Wulfcode by double-clicking the Wulfcode.jar file. Copying the config isn't absolutely necessary, but it's where all persistent options (screen colours, sizes, positions, MIDI device options, etc.) need to be set to make life easier. OS X's built-in IAC MIDI Bus (see Audio MIDI Setup in Utilities) is perfect for the virtual routing of MIDI data between your DAW and Wulfcode. Generally, you'll want to have one synth or sampler per DAW track, and each will be set to receive on a separate MIDI channel between 1 and 16. Once DAW playback is started, and its MIDI clock is being sent out to the IAC Bus on which Wulfcode is receiving, and Wulfcode is sending its output to an IAC Bus on which the DAW is receiving, any Note Objects you create in Wulfcode should start playing notes!

Compiling:

I'm using Eclipse Juno on OS X, so this entire repo might be importable into Eclipse as a project. It is confirmed to work on eclipse Mars. If not, the Java code is all in one file, and the only dependencies are

Processing is required by The MidiBus and is not otherwise used - if you want Wulfcode to be free of Processing, you'll have to write your own MIDI code. I did once de-Processing-ify The MidiBus for another project, but it's years out of date.

Add these two external libraries in your build path and maybe it'll work...

Otherwise the eclipse project is bound to maven and processing is part of the pom.xml dependencies. I added the midibus as a dependency, thought it is not available in a maven repo as I am writing this, you have to add it manually via build path option in eclipse.

The maven dependencies are :

You have to add themidibus folder to the project root.

To Do:

To Not Do:

May Never Be Done:

Available commands:

NOTE OBJECT: e.g. noter c0 {7.53a30077232325} 6 0

CHORD OBJECT - "chord" or "ch": e.g. chord g {02357e}

VELOCITY OBJECT - "velo" or "vl": e.g. velo noter {aba777ba}

CC OBJECT - "cc": e.g. cc panner c0 10 {020410ab0c32} 12 0

HOOF - "hoof" or "hf": e.g. hoof noter

PAUSE/UNPAUSE - "pause" or "ps" / "unpause" or "up": e.g. pause noter

MUTE/UNMUTE - "mute" or "mt" / "unmute" or "um": e.g. mute noter

PAUSE TOGGLE - "ptoggle" or "ptog": e.g. ptoggle noter

MUTE TOGGLE - "mtoggle" or "mtog": e.g. mtoggle noter

SEMICOLON SEPARATOR: e.g. pause noter; unpause snare

MULTIPLY/DIVIDE NOTE OBJECT RATE: e.g. /2 noter; *4 snares

NUDGE - "<<" or ">>": e.g. << drumr; >> noter

KEY - "key": e.g. key -24; key 24

KILL - "kill": e.g. kill noter; kill chordy

CHANNEL KILL - "ckill": e.g. ckill 12

OPACITY - "opacity": e.g. opacity 80

MIDIDEVICE - "mididevice" or "mdev":

UNDO/REDO:

CONFIG FILE: