Tuesday, January 31, 2012

orchsyn

Copperbox revision 2701.

I've added the phantom typing for control and audio rates as originally done in ZSnd. This code had some problems so it will likely need reworking once I get enough code in place to actually run Orchsyn.

Monday, January 30, 2012

orchsyn

Copperbox revision 2700.

I've added a module defining the builtin Csound functions.

Sunday, January 29, 2012

orchsyn

Copperbox revision 2699.

New project - orchsyn - orchestra synthesizer.

This replaces FMSS, I've decided there is a case for an EDSL to generate Csound orchestras.

Previously my feeling was that generating Csound instruments was unwise - with ZSnd, the earliest prototype, descriptions were always longer than the Csound they generated and the mechanisms of the generator lost too much of power and generality of Csound (it wasn't a full embedding). ZSnd had no real benefits to counter these problems.

Still, Csound orchestras have severe modularity problems - basically there is no modularity. Instruments cannot be put in libraries to be imported by an orchestra, they have to be copy-pasted and tweaked not to name clash. An embedding can inherit the modularity features of the host language, so even if the instrument descriptions are more verbose than the corresponding Csound there is the possibility that this can be countered by introducing modularity and allowing the definition of libraries of instruments.

Thursday, January 26, 2012

majalan-core

Copperbox revision 2698.

I've changed the argument type from Double to a union of Int or Double. This allows neater printing.

Wednesday, January 25, 2012

majalan-core

Copperbox revision 2697.

I've added a dictionary of column specs so multiple instruments can be printed in a score. Also the initial test appears to work...

Tuesday, January 24, 2012

majalan-core

Copperbox revision 2696.

I've implemented (but not tested) event list printing with both formatted column widths and carry printing i.e. using a single dot as an ellipses when subsequent values are the same.

Monday, January 23, 2012

majalan-core

Copperbox revision 2695.

I'm reactivating Majalan so it can follow the re-designed note list / score in ZMidi-Basic.

Unfortunately, Majalan-Core is really crufty due to a bad initial design where I didn't know what I was doing. So I'll have to redesign that first, before I can rework Majalan-Basic. 

Sunday, January 22, 2012

zmidi-basic

Copperbox revision 2694.

I've now reworked the core data types to have nice concatenation (rather than inefficient concatenation).

Friday, January 20, 2012

zmidi-basic

Copperbox revision 2693.

I've implemented stretch and reverse for the new event list.

Tomorrow when I've more time, I'll integrate the new list into the code - adding it invalidates a lot of the previous code so it will take a while to do.

Thursday, January 19, 2012

zmidi-basic

Copperbox revision 2692.

Work on a better EventList data structure that supports cheap concat. The new structure supports cheap concat as it is represented by a binary tree of lists, I've still to work out how to do transformations which will probably flatten any trees that have built up in the structure.

Sunday, January 15, 2012

supercollider

Copperbox revision 2691.

I've fixed the problem with the hi-drum, it seems like it was another problem with mis-using conditionals in server / synthdef code. It doesn't seem like I can use a symbol (or boolean) to represent whether to select the hi-drum, instead I have to follow the Csound code and represent low drum with 0.0 and hi-drum with not 0.0. My current understanding is that all values on the server must be floats...

supercollider

Copperbox revision 2690.

Improvements to the FM drum instrument. The low version now sounds equivalent to the Csound version, the hi version is still not quite right.

To get the equivalent of Csound's rand noise signal I used WhiteNoise and for transeg like envelopes setting the curve of an Env to a list of curve shapes works. Using the spectrum view provided by Audacity has proved essential for comparing Csound and SuperCollider instruments. It was crucial last summer for comparing CLM and Csound instruments likewise.

Saturday, January 14, 2012

supercollider

Copperbox revision 2689.

I've added a SuperCollider translation of the CLM tubular bell instrument that I converted to Csound last summer.

Friday, January 13, 2012

supercollider

Copperbox revision 2688.

I've added yestersday's fm-gong and fm-drum to copperbox. Both are ports of instruments in the CLM-4 distribution. Fm-drum still needs some work as it doesn't sound like my Csound version.

Thursday, January 12, 2012

supercollider gong

Here's the FM gong I implemented last summer in Csound:

http://varioussmallfires.blogspot.com/2011/07/fm-gong.html

SynthDef("fm-gong", {
 arg freq, dr = 1.0, amp = 1.0;
 var mod1sig, mod1f = freq * 1.16;
 var mod2sig, mod2f = freq * 3.14;
 var mod3sig, mod3f = freq * 1.005;
 var idx1a = 0.01 * mod1f;
 var idx1b = 0.30 * mod1f;
 var idx1scaler   = idx1b - idx1a;

 var idx2a = 0.01 * mod2f;
 var idx2b = 0.38 * mod2f;
 var idx2scaler   = idx2b - idx2a;

 var idx3a = 0.01 * mod3f;
 var idx3b = 0.50 * mod3f;
 var idx3scaler   = idx3b - idx3a;

 var mod1env, mod2env, mod3env, ampenv;
 var carsig;

 mod1env = EnvGen.kr(
  Env(levels: [0,1,1,0], times: [0.75*dr, 0.24*dr, 0.01*dr]),
  doneAction: 2);

 mod2env = EnvGen.kr(
  Env(levels: [0,1,0], times: [0.02*dr, 0.98*dr]),
  doneAction: 2);

 mod3env = EnvGen.kr(
  Env(levels: [ 0, 0.3, 1, 0.5, 0], times: [0.15 * dr, 0.15 *dr, 0.45*dr, 0.25*dr]),
  doneAction: 2);

 // Exp curve...
 ampenv = EnvGen.kr(
  Env(levels: [ 0, 1, 0.001], times: [0.002, dr - 0.002], curve: \exp),
  doneAction: 2);

 mod1sig = SinOsc.ar(freq: mod1f);
 // envelope the signal, afterwards
 mod1sig = mod1sig * ((idx1a + idx1scaler) * mod1env);

 mod2sig = SinOsc.ar(freq: mod2f);
 // envelope the signal, afterwards
 mod2sig = mod2sig * ((idx2a + idx2scaler) * mod2env);

 mod3sig = SinOsc.ar(freq: mod3f);

 // envelope the signal, afterwards
 mod3sig = mod3sig * ((idx3a + idx3scaler) * mod3env);

 carsig = SinOsc.ar(freq + mod1sig + mod2sig + mod3sig);

 Out.ar(0, carsig * ampenv * amp); 

}).store


Possibly I can use 'mul' rather than envelope the modulator signals afterwards.

Sunday, January 8, 2012

SuperCollider notes

Copperbox revision 2685.

Work on SuperCollider learning notes. I haven't worked out what I want to say yet - possibly I want to make notes for people who know functional programming well but are new to SuperCollider. I don't want to make a general introduction as there are two of these in the SuperCollider book.

As I don't know what I want to say and I'm learning as I go along, the notes are insubstantial (less than a page so far). I'd like to make a daily commit to Copperbox - I want to get back into this habit, but I might not bother with an attendant blog post as there isn't much to say about the work at the moment.

Saturday, January 7, 2012

jerry-osc

Copperbox revision 2684.

I've added a Double64 constructor to the Atom datatype - SuperCollider needs this non-standard argument.

Note to self - I will have to make Jerry-OSC gracefully handle argument types it isn't hard coded to recognize. Currently it fails with a fatal parse error.

Also I've added a place holder TeX document so I can collect notes as I learn SuperCollider. I'm going to be busy this month, so I might not have time for much Haskell coding, but I should be able to fit in some dabbling with SuperCollider each day.

Friday, January 6, 2012

jerry-supercollider

Copperbox revision 2683.

Work on getting jerry to talk with SuperCollider rather then just send commands (and not listen).

Ahem, my knowledge of writing networking code is non-existent so I'm having to do everything from scratch.

Tuesday, January 3, 2012

jerry-supercollider

Copperbox revision 2682.

New (mini) project to talk to SuperCollider with jerry-osc.

Currently it has a single operation - shutdown the server...

Monday, January 2, 2012

zmidi-basic

Copperbox revision 2681.

I've removed the TimeSpan module as objects are now annotated with duration rather than TimeSpan.

zmidi-basic

Copperbox revision 2680.

I've improved the symbolic representation so reverse now works. Note, TimeSpan no longer makes sense as all TimeSpan's now start at zero, so caching duration would be better.

zmidi-basic

Copperbox revision 2679.

First attempt to add symbolic transformations to ZMIDI - e.g reverse, scale, move.

Currently the implementation doesn't work...

Sunday, January 1, 2012

zmidi-basic

Copperbox revision 2678.

I've added Chains (as per Wumpus-Basic and TikZ) and fixed a bug with MIDI duration calculation.

Blog Archive

About Me

My photo
Disambiguating biog as there are a few Stephen Tetley's in the world. I'm neither a cage fighter or yachtsman. I studied Fine Art in the nineties (foundation Bradford 1992, degree Cheltenham 1992 - 95) then Computing part-time at Leeds Met graduating in 2003. I'm the Stephen Tetley on Haskell Cafe and Stackoverflow.