Music 160A meetings

project development meetings, bring research materials, bibliography

week 4 – wednesday jan 30th

  • 11:00 – Levick
  • 11:20 – Garcia
  • 11:40 – Doan
  • 12:00 – Valencia
  • 12:20 – Hess
  • 12:40 – Reid
  • 1:00 – Zamora
  • 1:20 – Bari

week 5 – wednesday feb 6th

  • 11:00 – Greenwood
  • 11:20 – Ablay
  • 11:40 – Huynh
  • 12:00 – Morales
  • 12:20 – Villegas
  • 12:40 – Hsieh
  • 1:00 – Tindall
  • 1:20 – Liu


Some notes on For Ann (rising)

James Tenney composed For Ann (rising) in 1969 and made several realizations with tape and signal generators. In 1991 I was asked to engineer a compilation of his early computer and electronic music, “Selected Works 1961-1969″. Instead of using one of the tape versions of For Ann (rising), we decided to realize it digitally in Csound. Jim described the piece to me over the phone. The piece consists of 240 sine wave sweeps, each of which lasts 33.6 seconds long and rises 8 octaves (4.2 seconds per octave). Each sweep has a trapezoidal amplitude envelope which rises from 0.0 to 1.0 gain in the first two octaves, stays at 1.0 for the 4 mid octaves, and drops from 1.0 to 0.0 for the top two octaves of each sweep. A new sweep starts every 2.8 seconds. The initial Csound orchestra and score was simply:

instr 1
kf expon 40, 33.6, 10240
ka linseg 0, 8.4, 2000, 16.8, 2000, 8.4, 0
a1 oscil ka, kf, 1
out a1
f1 0 16385 10 1
i1 0 42
i1 2.8 42
i1 5.6 42
and so on.....

The tuning difference between each successive sweep is a 12tet minor 6th.

For the final version on the CD, Jim asked me to extend each sweep by 4.2 seconds (1 more octave). We moved the start point to A0 (27.5 Hz) – the end of each sweep is A9 (14080 Hz). This increased the length of the piece slightly 240 * 2.8 + 33.6 + 4.2 = 11:49.8.

I have recently put together a new realization of For Ann (rising) in Pure Data. I am using metro, delay and vline to generate the sweeps in this version, as these objects (unlike many objects in PD) are sample accurate, and should give consistent tuning accuracy. Also for this realization, I have added the capability to perform the piece with the original 12tet minor 6th, a just 1.6 ratio, and a golden mean (phi) ratio between successive sweeps.

The PD patch is available here, for those who want to hear the piece.

mus177/206 – updated fuzztrem, other JUCE details

Here is the updated fuzztrem plugin with 3 parameters and controls added ClassTest1126.

Sample code to parse MIDI – noteOff, noteOn and bendPitch are my own methods – you will need to write your own versions of these methods to connect the MIDI data to your process.

   MidiBuffer::Iterator it(midiMessages);
    MidiMessage msg(0x80,0,0,0);
    int pos;
    int32_t note;

    // start with the MIDI processing
    while(it.getNextEvent(msg , pos))
            note = msg.getNoteNumber();
            note = msg.getNoteNumber();

Simple code to save your current settings to a session (pulled from my plugin ++pitchsift)

void PitchsiftAudioProcessor::getStateInformation (MemoryBlock& destData)
    // You should use this method to store your parameters in the memory block.
    // You could do that either as raw data, or use the XML or ValueTree classes
    // as intermediaries to make it easy to save and load complex data.
    ScopedPointer xml (parameters.state.createXml());
    copyXmlToBinary (*xml, destData);

void PitchsiftAudioProcessor::setStateInformation (const void* data, int sizeInBytes)
    // You should use this method to restore your parameters from this memory block,
    // whose contents will have been created by the getStateInformation() call.
    // This getXmlFromBinary() helper function retrieves our XML from the binary blob..
    ScopedPointer xmlState (getXmlFromBinary (data, sizeInBytes));

mus177/206 – introduction to JUCE

This week we will be getting started in using JUCE to create audio plugins. I will show you both the audio processing and graphic layers, and how they connect. To start, you need to download the JUCE SDK from Join with either the Education or Personal license.

Along with these lessons, you should look at the following youtube videos from The Audio Programmer (Joshua Hodge) – These cover most relevant aspects of JUCE in detail. Much better than the tutorials on the JUCE website.

Here is the class example from week 7. It was pointed out to me that JUCE has deprecated the existing createAndAddParameter method (with all the arguments). The valid way to use this method is to create a RangedParameter and hand it to createAndAddParameter. Here is gain from the class example: I create an AudioParameterFloat which gets added to the value tree (std::make_unique is a safer substitute for new).

 parameters.createAndAddParameter(std::make_unique<AudioParameterFloat>("gain", // parameter ID
 "gain", // parameter name
 NormalisableRange<float> (-60.0f, 12.0f), // range
 0.0f, // default value


mus177/206 – filter code

Here is a collection of filter external source code for Pure Data.

  • 1 pole lowpass
  • 4 pole lowpass with feedback
  • 1st order allpass
  • 2nd order allpass with bandwidth
  • state variable filter

Lowpass, highpass and phasors can be created by modifying the 1st order allpass. Bandpass and bandstop filters can be created by modifying the 2nd order allpass.

Download this zip archive for the source code:

mus177/206 – third assignment

  1. make 2 audio externals, one which generates sound, one which processes sound.
  2. both externals should take a float message or an extra signal inlet to allow timbre modulation
  3. make a pd patch which uses both externals and demonstrates controls
  4. make sure input signals and messages do not go beyond allowed limits
  5. comment your code and pd patch
  6. turn in code and pd patch week 6 tuesday