Linux Midi on SuperCollider

This is just how I got it to work and should not be considered a definitive guide.
I started Jack via QJackCntrl and then booted the SuperCollider server.
I’ve got a drum machine connected via a MIDI cable to an m-audio fast track ultra.
This code is Making some noises:

(
var ultra;

MIDIClient.init;
"init".postln;
MIDIClient.destinations.do({|m, i|
 //m.postln;
 //m.name.postln;
 m.name.contains("Ultra").if({
  ultra = MIDIOut(i);
  ultra.connect(0);
  i .postln;
 });
});

//u = ultra;

Pbind(
 midinote, Pseq((36..53), inf),
 amp, 1,
 type, midi,
 midiout, ultra,
 chan, 1,
 foo, Pfunc({|e|"tick % %n".postf(e[chan], e[midinote])}),
 dur, 0.2
).play


)

California time Table

Hello California friends. I am in your state. This is my schedule for the next few days:
Tonight, 28 May, I am going to the SF Sound show. Maggi Payne is playing, so it will be awesome. It’s at 55 taylor :: san francisco :: $10/7 :: 7:49p.
29 May, I will be going to see ReCardiacs Fly at the Hemlock Tavern. This is Polly Moller (and friends) new project, so it will be awesome. It’s at 1131 Polk St :: san francisco :: $7 :: 8:30p.
30 May, I will be playing as half of the duo No More Twist at the Berkeley Arts Festival Space. Jörg Hiller is also playing, so it will be awesome. It’s at 2133 University :: berkeley :: $10-20 (sliding scale) :: 7:30p.
I have a minor injury which makes it slightly painful for me to bicycle, so I’m being intentionally vague about my schedule. I hope to head down to the South Bay for a short while and available for socialising.
On June 3rd, my girlfriend flies in to San Francisco, so I’ll be back in the SF/Oakland part of the bay and doing tourist stuff and available for socialising.
On June 6th, I will be playing the piece Cloud Drawings at the Luggage Store Gallery. It’s at 1007 Market Street (by 6th) :: san francisco :: $6-$10 :: 8p.
On 7 June, I will be playing the piece Cloud Drawings at the SubZero festival in San Jose and will be around the South Bay and available for socialising. I also want to do some touristy stuff down there, so if anyone has any suggestions or wants to go to something, please let me know. I think we should probably see the Winchester Mystery House. We’ll also head for scruz at some point.
More details as they arise. contact me if you want to hang out.

A better script for Wacom with screen geometry changes

Why and how

This is a better script to set your stylus setting to match a changed resolution, like if you plugged in to a projector. If you are mirroring screens, the geometry may change, so that instead of using your whole 16/9 ratio screen, you’re only using a 4/3 box in the middle. The problem you may run into is that your stylus does not adjust and so where you’re pointing the stylus may differ significantly from where the pointer appears on the screen. This script fixes that.
There are some dependencies: xsetwacom xrandr, and wcalc. Make sure you have xsetwacom by typing:

which xsetwacom

If it doesn’t give you a path, you need to:

sudo apt-get install xsetwacom

Do the same for xrandr. Finally, you need wcalc, which is not installed by default. Type:

sudo apt-get install wcalc

The script is below. To save it, copy it to the clipboard starting from just below the ‘Script’ subheader and ending just above the ‘Commentary’ subheader. Then type the following in the terminal:

cd
mkdir bin
cd bin
touch stylus_script.sh
chmod +x stylus_script.sh
gedit stylus_script.sh

Don’t worry if you get an error saying bin already exists. Just carry on.

Gedit should open with a blank file. Paste the script into that file. Then save and quit. You may not need to make any changes. (See commentary.)
You’ll want to run this script when you plug into a projector (after you set the resolution you’re going to use) and then again when you unplug from it. Do this in the terminal by typing:

~/bin/stylus_script.sh

You can run these from any terminal window, at any time and it should work. If you get errors or it just doesn’t do anything, see the commentary below.

Script

#!/bin/bash


function touch_ratio {
 #get pen geometry
 LINE=`xsetwacom get "Wacom ISDv4 E6 Pen stylus" area`
 echo ${LINE}
 TabTx=`echo ${LINE} | awk '{ print $1 }'`
 TabTy=`echo ${LINE} | awk '{ print $2 }'`
 TabBx=`echo ${LINE} | awk '{ print $3 }'`
 TabBy=`echo ${LINE} | awk '{ print $4 }'`

 TouchHeight=$((${TabBy} -${TabTy}))
 TouchWidth=$((${TabBx} -${TabTx}))

 TouchRatio=`wcalc -q ${TouchWidth}/${TouchHeight}`

}



# get screen geometry
LINE=`xrandr -q | grep Screen`
WIDTH=`echo ${LINE} | awk '{ print $8 }'`
HEIGHT=`echo ${LINE} | awk '{ print $10 }' | awk -F"," '{ print $1 }'`
RATIO=`wcalc -q ${WIDTH}/${HEIGHT}`



touch_ratio

# is the touch ratio different from the screen ratio?
change=`wcalc -q abs(${TouchRatio}-${RATIO})>0.01`
wcalc -q abs(${TouchRatio}-${RATIO})
if [[ ${change} != 0 ]] 
  then

 #they differ

 # first try resetting
 xsetwacom set "Wacom ISDv4 E6 Pen stylus" ResetArea
 xsetwacom set "Wacom ISDv4 E6 Pen eraser" ResetArea 
 xsetwacom set "Wacom ISDv4 E6 Finger touch" ResetArea

 # how about now?
 touch_ratio
 
 if [[ `wcalc -q abs(${TouchRatio}-${RATIO})>0.01` != 0 ]] #they differ
   then

  if [[ ${TouchRatio} > ${RATIO} ]] # width has shrunk
    then
   # use existing height values
   TYOFFSET=${TabTy};
   BYOFFSET=${TabBy};

   # calculate new width values
   # width = ratio * height
   
   NewTabWidth=`wcalc -q -P0 ${RATIO}*${TouchHeight}`
   TabDiff=$(( (${TouchWidth} - ${NewTabWidth}) / 2));

   TXOFFSET=$((${TabTx} + ${TabDiff}));
   BXOFFSET=$((${TabBx}- ${TabDiff}));

    else # height has shrunk

   # use existing width values
   TXOFFSET=${TabTx};
   BXOFFSET=${TabBx};

   # calculate new height values
   # height = width / ratio

   NewTabHeight=`wcalc -q -P0 ${TouchWidth}/${RATIO}`
   TabDiff=`wcalc -q (${TouchHeight}-${NewTabHeight})/2`
   
   TYOFFSET=`wcalc -q ${TabTy}+${TabDiff}`
   BYOFFSET=`wcalc -q ${TabBy}-${TabDiff}`

    fi


  echo ${TXOFFSET} ${TYOFFSET} ${BXOFFSET} ${BYOFFSET}
  xsetwacom set "Wacom ISDv4 E6 Pen stylus" Area ${TXOFFSET} ${TYOFFSET} ${BXOFFSET} ${BYOFFSET}
  xsetwacom set "Wacom ISDv4 E6 Pen eraser" Area ${TXOFFSET} ${TYOFFSET} ${BXOFFSET} ${BYOFFSET}
  xsetwacom set "Wacom ISDv4 E6 Finger touch" Area ${TXOFFSET} ${TYOFFSET} ${BXOFFSET} ${BYOFFSET}

   fi
 #gnome-control-center wacom
  else
 echo normal resolution
fi

Commentary

If this script doesn’t work, it may be because the name of your wacom devices differs from mine. To find the names of your devices, type:

xsetwacom --list

You will get a list of your wacom devices. Mine looks like this:

Wacom ISDv4 E6 Pen stylus        id: 10 type: STYLUS    
Wacom ISDv4 E6 Finger touch      id: 11 type: TOUCH     
Wacom ISDv4 E6 Pen eraser        id: 15 type: ERASER    

In this script, I use the information at the far left: ‘Wacom ISDv4 E6 Pen stylus’ and the two identifiers below that. If your device list has different names, then replace the names in the script with the names of your devices. So if you have, ‘Wacom ISDv7 E13 Pen Stylus’, you would use that instead. These lines show up multiple places in the script, so if you need to change it, make sure you get it every time, down to the bottom of the file.

How it works

This script gets the geometry of your screen and the geometry of your stylus and calculates the width/height ratio for each. If this differs by more than a fractional amount, it calculates a new width or height for your stylus.

Anxiety and Musical Form

My gf asked me why I don’t blog about having anxiety. There’s a few reasons I haven’t mentioned it much of late. Part of the reason for this is that while it shapes a certain amount of my experience, I absolutely do not want it to become a point of identity. Partly, I’d rather talk about things that are more interesting, like music. (There’s nothing quite so boring as other people’s health problems.) And maybe most importantly, I’m embarrassed about it.
But yeah, something about my fight-or-flight response is not working correctly and I get panic attacks.
I’m going to get a referral for CBT – cognitive behavioural therapy, which has been shown to be effective. I kind of know what leads to them. If I’m stressed or not eating right or especially if I’m short on sleep, I’m much more likely to get them. I read some place that they normally last about half an hour and I don’t know if this is true or not, but I do know that if I wait and take deep breaths, they tend to go away.
In case you’ve never had a panic attack, (lucky you), I shall attempt to describe it. For me, it is what it sounds like, a sudden stab of panic. You know when you go out and you’re nearly to the tube station and think, ‘oh my god, did I leave the stove on?!’ It’s like that, but I tend to think maybe I have cancer or something. While one can turn around and go home and check if they’ve forgotten a pan of beans bubbling away, one can’t do that with a sudden fear of dread disease. So I try to talk myself out of it, but can get into a loop: ‘I’m fine because of X. But what about Y?’ Repeat for several minutes. This is very annoying. Especially when I know I’m in a loop. I know I’m being irrational. But I can’t seem to shake it. Because what about Y??! And maybe it just goes away quietly, or maybe I start shaking and phone NHS Direct.
What sets these off? Sometimes it’s because something is actually wrong with me. And, indeed, when I said I phone NHS Direct, this is actually not entirely true – I have a stone in one of my spit glands. It hurts occasionally and once in a great while, it blocks something and swells a bit. Eventually, somebody is going to remove it. But anyway, one day, before it was x-rayed, my neck swelled slightly and I saw it in the mirror and went into a panic. Sure, the dentist said he thought it was probably a stone, but what if it’s actually a terrible infection that’s spread to something important in my neck before it turns into blood poisoning or gets into my brain and might kill me by morning. (‘I’m fine because if I had a horrible infection, I would have a fever. But what about my swollen neck?’ Repeat for several minutes.) It was a Friday evening, so I phoned NHS Direct and they said it sounded like something that might happen with a spit gland stone and if it hadn’t gone down by Monday morning, I should ring my dentist. This was exactly the calm reassurance I wanted from the NHS. (God bless the NHS.) Then, unexpectedly, they started reading a list of diseases that might be associated with swollen necks. Glandular fever. (Mononucleosis to Americans.) ‘No, I already had that.’ Mumps. ‘I’m vaccinated.’ Meningitis. ‘Doesn’t that usually have a fever?’ I was starting to get alarmed. The woman on the phone was starting to get annoyed. She just had a script to read through (I guess so nobody can say they weren’t warned?) and didn’t want to be interrupted. Lupus. ‘Wait, what? How do I know if I have lupus??’ I hadn’t even considered this possibility. The woman sighed in an irritated manner. I have not rung the NHS Direct since.
Most often what sets off a panic attack is that I’m trying to ignore some emotion I’m having. Something has upset me. I don’t want to deal with it. I tell myself I’m fine and carry on. And then: ‘Wait, what if that cat I just pet has rabies?’ Sometimes, I can identify what emotion or thought I’m trying to nullify and go deal with it and be fine. Often it’s just some really small erasure. Very often, I’m not even aware that I’m doing it. Some part of my brain has intercepted my experience and tried to overwrite it and I haven’t even noticed. This is what I hope CBT can help with, since I really want to stop doing that. I mean, I don’t like having negative emotions, but they’re vastly preferrable to panic attacks.
Also, these erased emotions are sometimes important ones, but often are fairly small. So let’s say I’ve read something that reminds me of LGBT-phobia in schools and its affecting and I just don’t feel like thinking about that at the moment, so there’s an erasure. ‘What if that friendly cat is actually rabid?’ I try to ignore the thought, so there’s another avoidance. ‘I am feeling panicked about this cat and this is stupid, so I must try to hide it or else everyone will know I’m crazy.’ And thus something small builds.

Musical Forms

I did my undergraduate music education sort of the wrong way around. I didn’t expect to want to get a degree in it, so I started by taking all the upper division classes and seminars because they were most interesting. So I learned about how John Cage rejected all the old way of doing things that were not useful any more in the 20th century. Music theory is a old and unneeded! I accepted this at face value. (Never mind how a lot of minimalists, who I loved, worked a lot with harmony.) Then, after I decided I wanted to get a music degree, I had to take all the first year classes in counterpoint, history and all of this stuff I had already rejected. I insisted that John Cage had said it was useless. My teachers disagreed, but since they were the same ones who had told me a few months earlier that this was the stuff of the past, I felt their position was somewhat weakened. Anyway, I graduated, having learned as little traditional stuff as possible.
It wasn’t long after graduation that I became aware that perhaps I had been overzealous in my embracing of Cagean values. I wanted to write something harmonic, but all I actually knew how to do were chorales and I didn’t even know most of the rules for them. How to structure anything was a mystery. I know that forms existed and they had names, but what those meant, I had no idea.
I got to grad school (a decade ago) and somebody commented that everything I wrote was in sonata form. I had no idea. Maybe I should mix this up a bit more? I didn’t know any other forms.
Obviously the thing to do about this gap in my knowledge was to feel deep shame and attempt to hide it. So rather than read a book or ask a teacher, I just hoped nobody noticed how I was nowhere near good enough to actually be qualified to be in an MA program. (To be fair, I was REALLY busy trying to learn every other thing that everybody around me already seemed to know.)
At some point, I finally learned that while there are named forms that exist, form is arbitrary. It’s just any structure you can use to make sense of things. It can sometimes be implied by the material, or it can be decided in advance. Some Cage pieces are all about form. They are vessels into which you can pour any material and the structure somehow causes the material to sound better. Forms are like that. I don’t feel worried about them any more and while my classical vocabulary is still a bit lacking, I’m not overly concerned about this. Anyway, since I moved to England, I don’t even know note names any more, so not knowing how to organise a minuet is somewhat less important than not being able to remember the duration of a semi-quaver or a minim.
If you are hoping for some insight: The important thing to remember about structures is that they fix musical problems. This is how to write a piece of music: Put your material into a structure, then get the ending perfect, then get the beginning nice, then do the middle bits. Then write some glue to hold everything together. If your middle section is supposed to be 5 minutes long but is getting dull by minute three, you can either make it shorter or subdivide it – so instead of being one long thing, it’s got an ABA or ABC structure within it, so it moves between related ideas. That is to say, add some stuff.
As I recall, Cage didn’t talk much about the importance of structure directly, but he implied the hell out of it. Lecture on Nothing is nothing but structure. This is much more vital than the ‘ignore harmony’ that I first got from my youthful introduction. I was over-eager to be freed from a prison I’d never even been in. But aren’t we all? Especially when we’re young.

What’s the Connection?

This post is in AB form, with a small coda.

My Talk at the Sc Symposium

Picking Musical Tones

One of the great problems in electronic music is picking pitches and tunings.

The TuningLib quark helps manage this process.

First, there is some Scale stuff already in SuperColider.
How to use a scale in a Pbind:

(
s.waitForBoot({
     a = Scale.ionian;

     p = Pbind(
          degree, Pseq([0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0, rest], 2),
          scale, a,
          dur, 0.25
     );

     q = p.play;
})
)

Key

Key tracks key changes and modulations, so you can keep modulating or back out of modulations:

k = Key(Scale.choose);
k.scale.degrees;
k.scale.cents;
k.change(4); // modulate to the 5th scale degree (we start counting with 0)
k.scale.degrees;
k.scale.cents;
k.change; // go back

k.scale.degrees;

This will keep up through as many layers of modulations as you want.

It also does rounding:

quantizeFreq (freq, base, round , gravity )
Snaps the feq value in Hz to the nearest Hz value in the current key

gravity changes the level of attraction to the in tune frequency.

k.quantizeFreq(660, 440, down, 0.5) // half way in tune

By changing gravity over time, you can have pitched tend towards being in or out of tune.

Scala

There is a huge library of pre-cooked tunings for the scala program. ( at http://www.huygens-fokker.org/scala/scl_format.html
) This class opens those files.

a = Scala("slendro.scl");
b = a.scale;

Lattice

This is actually a partchian tuning diamond (and this class may get a new name in a new release)

l = Lattice([ 2, 5, 3, 7, 9])

The array is numbers to use in generated tuning ratios, so this gives:

1/1 5/4 3/2 7/4 9/8   for otonality
1/1 8/5 4/3 8/7 16/9  for utonality

otonality is overtones – the numbers you give are in the numerator
utonality is undertones – the numbers are in denominator

all of the other numbers are powers of 2. You could change that with an optional second argument to any other number, such as 3:

l = Lattice([ 2, 3, 5, 7, 11], 3)

Lattices also generate a table:

1/1  5/4  3/2  7/4  9/8
8/5  1/1  6/5  7/5  9/5
4/3  5/3  1/1  7/6  3/2
8/7  10/7 12/7 1/1  9/7
16/9 10/9 4/3  14/9 1/1

It is possible to walk around this table to make nice triads that are harmonically related:

(
s.waitForBoot({

 var lat, orientation, startx, starty, baseFreq;

 SynthDef("sine", {arg out = 0, dur = 5, freq, amp=0.2, pan = 0;
  var env, osc;
  env = EnvGen.kr(Env.sine(dur, amp), doneAction: 2);
  osc = SinOsc.ar(freq, 0, env);
  Out.ar(out, osc * amp);
 }).add;

 s.sync;


 lat = Lattice.new;
 orientation = true;
 startx = 0;
 starty = 0;
 baseFreq = 440;

 Pbind(
  instrument, sine,
  amp, 0.3,
  freq, Pfunc({
   var starts, result;
     orientation = orientation.not;
     starts = lat.d3Pivot(startx, starty, orientation);
     startx = starts.first;
     starty = starts.last;
   result = lat.makeIntervals(startx, starty, orientation);
   (result * baseFreq)
  })
 ).play
})
)

Somewhat embarrassingly, I got confused between 2 and 3 dimensions when I wrote this code. A forthcoming version will have different method names, but the old ones will still be kept around so as not to break your code.

DissonanceCurve

This is not the only quark that does dissonance curves in SuperCollider.

Dissonance curves are used to compute tunings based on timbre, which is to say the spectrum.

d = DissonanceCurve([440], [1])
d.plot

The high part of the graph is highly dissonant and the low part is not dissonant. (The horizontal access is cents.) This is for just one pitch, but with additional pitches, the graph changes:

d = DissonanceCurve([335, 440], [0.7, 0.3])
d.plot

The combination of pitches produces a more complex graph with minima. Those minima are good scale steps.

This class is currently optimised for FM, but subsequent versions will calculate spectra for Ring Modulation, AM Modulation, Phase Modulation and combinations of all of those things.

(

s.waitForBoot({

 var carrier, modulator, depth, curve, scale, degrees;

 SynthDef("fm", {arg out, amp, carrier, modulator, depth, dur, midinote = 0;
  var sin, ratio, env;

  ratio = midinote.midiratio;
  carrier = carrier * ratio;
  modulator = modulator * ratio;
  depth = depth * ratio;

  sin = SinOsc.ar(SinOsc.ar(modulator, 0, depth, carrier));
  env = EnvGen.kr(Env.perc(releaseTime: dur)) * amp;
  Out.ar(out, (sin * env).dup);
 }).add;

 s.sync;

 carrier = 440;
 modulator = 600;
 depth = 100;
 curve = DissonanceCurve.fm(carrier, modulator, depth, 1200);
 scale = curve.scale;


 degrees = (0..scale.size); // make an array of all the scale degrees


// We don't know how many pitches per octave  will be until after the
// DissonanceCurve is calculated.  However, deprees outside of the range
// will be mapped accordingly.


 Pbind(

  instrument, fm,
  octave, 0,
  scale, scale,
  degree, Pseq([
   Pseq(degrees, 1), // play one octave
   Pseq([-3, 2, 0, -1, 3, 1], 1) // play other notes
  ], 1),

  carrier, carrier,
  modulator, modulator,
  depth, depth
 ).play
});
)

The only problem here is that this conflicts entirely with Just Intonation!

For just tunings based on spectra, we would calculate dissonance based on the ratios of the partials of the sound. Low numbers are more in tune, high numbers are less in tune.

There’s only one problem with this:
Here’s a graph of just a sine tone:

d = DissonanceCurve([440], [1])
d.just_curve.collect({|diss| diss.dissonance}).plot

How do we pick tuning degrees?

We use a moving window where we pick the most consonant tuning within that window. This defaults to 100 cents, assuming you want something with roughly normal step sizes.

Then to pick scale steps, we can ask for the n most consonant tunings

t = d.digestibleScale(100, 7); // pick the 7 most consonant tunings
(
var carrier, modulator, depth, curve, scale, degrees;
carrier = 440;
modulator = 600;
depth = 100;
curve = DissonanceCurve.fm(carrier, modulator, depth, 1200);
scale = curve.digestibleScale(100, 7); // pick the 7 most consonant tunings
degrees = (0..(scale.size - 1)); // make an array of all the scale degrees (you can't assume the size is 7)

Pbind(
 instrument, fm,
 octave, 0,
 scale, scale,
 degree, Pseq([
  Pseq(degrees, 1), // play one octave
  Pseq([-7, 2, 0, -5, 4, 1], 1)], 1), // play other notes
 carrier, carrier,
 modulator, modulator,
 depth, depth
).play
)

Future plans

  • Update the help files!
  • Add the ability to calculate more spectra – PM, RM AM, etc
  • Make some of the method names more reasonable

Comments

Comments from the audience.

  • key – does it recalc the scale or not? Let the user decide
  • just dissonance curve – limit tuning ratios
  • lattice – make n dimensional
  • digestible scale – print scale ratios

Sc symposium – chris brown – ritmos

software to explore perception and performance of polyrhythms
inspired by afro-cuban music
ritmos can play in polyrythmic modes and can listen to a live input. It deals with a difference between a player and a clave.
this was first implemented in HMSL!! As a piece called Talking Drum.
Branches is in sc2 and is in the same series of pieces.
so now there’s a new version in sc3.

classes

RitmosPlay defines a voice stream heirachy and scheduling
RitmosCtlGUI
RitmosSeqGUI
RitmosSynthDefs
RitmosXfrm F interaction algorythms
MIDIListener
he uses a genetic algorithm to balance between the specified clave and the input.
he’s got presets and sequences that deal w current settings.
he’s going into a lot of detail about how this works. It’s complex.
this has an impressive gui. And indeed an impressive functionality. And sounds great.
graphics library… I wish i’d caught the name of…

Sc symposium – lily play – bernardo barros

music notation with supercollider
he used to use OpenMusic, but then moved to linux.
OpenMusic is IRCAM software in common lisp for algorithmic music composition. It looks like max, but makes notation.
SC can do everything om can do except the notation visualisation.
he uses LilyPond. INScore might be faster.
LilyPond is free and cross-platform. It’s simple.
He’s done 3 projects? superFomus and LilyCollider.

Fomus

Uses fomus (fomus.sf.net). Works with events and patterns. It outputs to lillypond and mjusescore
this is cool
he’s showing a useage case with xenakis’s sieves. He’s got some functions as sieves and then does set operations.
this doesn’t work well with metric structures. You’re stuck wrt bar lengths.

LilyCollider

division and addition models of rhythm
rhythm trees can represent almost all kins of rythm. It’s an array of duration and division that can be nested.
he is using a syntax that i don’t know at all… Someone in front of me has a help file open on list comprehensions.
he’s got a very compelling looking score open.
in future he wants to use spanners by abjad to handle some markings. And also he wants some help and feedback for future versions.

questions

can you use this to get from MIDI to LilyPond? Yes, with Fomus.
what about includes? You can make a template.

Live blogging the sc symposium – ron kuivila

naming is the fundamental control mechanism of supercollider (unnamed gets garbage collected).
‘play’ generates instances. It returns a new object of a different class, which confuses n00bs. What you see on the screen does not give you a clue.
The object that defines the work gets misidentified as the one doing the work.
jIT lib’s def classes solves this problem. It makes it easier to share code. Play messages go to the def class. The def classs gives it all a name.
node proxies give you a gui for free also and is also useful pedagogically.
PatternConductor is a interactive control easier than EventStreamPlayer. It deals better with sustain issues.
CV is a control value constrained by an associated Spec. CV can bbe applied to several different contexts simutaneously. Touch is a companion class that does something complex about a CV’s value.
Ron is rewriting Conductor and I should talk to him about this.
yield is a bummer for beginners writing co-routines.

x=(x**i).yield

is confusing.
Pspawnern is a class that seeks to be less confusing syntactically. It does something with Prouts that’s slightly confusing….
Syntactic convience yields conceptual confusion…
he’s asking if Pspawnern is a good idea.
Pspawner is a hybrid between patterns and Routines. One of my students would have loved this. He says it’s a compositional strategy about notation and direction in scores. I may also come to love this class.
And he took no questions!

Live Blogging Sc Symposium – Guitar Granulator by Martin Hünniger

He’s got a stomp box that granulates – he has a software and hardware version of this.
2 granulators, fx chains, midi controller knobs, patches etc in software
The hardware version has one granulator and some knobs.
It’s built on a beagle board. And an Arduino Uno for pots, leds
He uses SC running the BeagleBoard linux distro form Stanford. Works out of box. Satellite CCRMA
Granular synthesis is cool. He uses a ‘ring buffer’ because it’s live sampling. This is a buffer that loops.
This is really cool.

Live Blogging the Sc Symposium – Flocking by Colin Clark

Flocking – audio synthesis in javascript on the web

flockingjs.org
github/colinbdclark/flocking

audio synthesis framework written in javascript

specifically intended to support artists

Inspired by SC

Web is everywhere

programming environments that have graphical tools

Flocking is highly declarative

Synth graphs declares trees of names unit generators – you write data strictures, not code

Data is easy to manipulate

flock.synth({
  synthDef: {
    ugen: "flock.ugen.sinOsc",
    freq: 440
    mul: 0.25
  }
})

He skips the Rate:”audio” because that’s the default.
Modulation:

flock.synth({
  synthDef: {
    ugen: "flocl.ugen.sinOsc",
    freq: 440
    mul: {
      ugen:flock.ugen.line"
....
  }
})

It handles buffers and whatnot, but not multichannel expansion.
Scheduling is unreliable…but works