Augmented Hurdy Gurdy Experiments
As I can’t currently commit to building a new series of gurdies due to my living situation, I’ve been keeping myself busy developing the MIDI system for my instruments, to develop new extended, augmented playing techniques.
This video is the first demonstration of some hybrid electronic-acoustic experiments using the prototype MIDI system installed on my hurdy gurdy.
0:22 Technique: Pitch-shifting Polyphony
Gurdy MIDI and Audio → Apogee ONE → Macbook running a puredata patch
Monophonic acoustic gurdy signal is pitch-shifted down in real time to play chords and harmonies. Chords and intervals on the keyboard can also be used to pitch-shift the trompette signal (0:55) or the drones. Inspired by an idea from Sébastien Tron.
1:18 Technique: Expressive MIDI Controller
Hurdy Gurdy MIDI → DIY Hybrid Poly Synth based off Mutable Instruments Ambika
The keyboard and wheel sensors send MIDI note, expression and polyphonic aftertouch messages to a polyphonic synthesizer. In this case a split keyboard effect is used to play two sounds.
1:36 Technique: Layered Acoustic and Electronic Sound
Hurdy Gurdy Acoustic audio, Gurdy MIDI → DIY Hybrid Poly Synth based off Mutable Instruments Ambika
1:36 The acoustic string plays a melody, the bottom half of the keyboard controls a synthesizer with a long release for subtle held chords
2:08 Using trompette technique can send MIDI messages, used here to play synthesized percussion on an Ambika voice assigned to MIDI channel 10, whilst the keyboard plays chords.
2:30 Acoustic trompette and melody string sound layered over subtle polyphonic synthesized chords
Today’s late-night puredata madness: creating a 7-limit just intonation abstraction which takes standard 12TET MIDI note numbers and spits the 7-limit just version, expressed as a decimal MIDI note number:
Each canvas has a receive ID of $0- plus the symbol for the relevant filter mode, making the message sending for changing the colours easy.
[biquad~] clicks and pops when changing coefficients, which is annoying when they’re coming from the [filterview] UI. The best way I found of smoothing them was to alternate between two biquad~ objects and crossfade between them over 3ms. This approach, while a little cludgy, is probably generalisable to a lot of similar Pd situations where smooth transitions are desirable.
For those unfamiliar with #puredata, the equivalent in python would be creating a script which, in order to get user input, writes another python script containing a reference to the first, which, when run by the user, sends its output back to the first script. Which then launches another python process (based on the results of the first sub-script), and manages it’s status.
It’s a programming paradigm which makes absolutely no sense in any other environment, but in puredata is surprisingly elegant — a pleasant side-effect of the programming environment and end-user environment being effectively the same.
Btw, this is the first experimental step towards the most exciting project idea I’ve had in quite some time… watch this space!
typical Barnaby 01:00 insanity: implementing a patch browser and window manager in #puredata with weeeird semi-documented metaprogramming
Jetbrains PyCharm does have an inline documentation feature, which (when invoked via a complex keyboard “shortcut”), produces this gem:
Even when this feature does work, it shows code “documentation” in a monospace font, typically with no usage example or links to other relevant documentation, as is standard in puredata.
Our tools are inadequate.
It’s hard to beat cardboard, Arduino and puredata for quick electronic #music hardware prototyping:
Helpful #puredata tip: if you cannot move objects around in edit mode, it’s probably due to not having an audio device configured. Because that totally affects being able to drag boxes around.
My first puredata patch: Canoner! A cross between a delay and a looper, this patch allows you to play canons solo.
Hit Start/Round as you start playing, then again at a round point, and the patch will continue to play what you played with that delay until you hit Stop.
Extending the canoner to support n>2 part canons is left as an exercise for the reader.
#N canvas 405 217 363 240 10; #X obj 26 34 tgl 40 0 empty empty empty 17 7 0 10 -204786 -1 -1 0 1 ; #X obj 26 84 route 1 0; #X obj 214 201 delwrite~ round 10000; #X obj 214 176 adc~; #X obj 26 117 timer; #X obj 26 148 delread~ round; #X obj 26 198 dac~; #X floatatom 165 149 5 0 0 0 - - -; #X floatatom 129 149 5 0 0 0 - - -; #X obj 26 174 *~ 0; #X obj 101 34 bng 40 250 50 0 empty empty empty 17 7 0 10 -260097 -1 -1; #X text 13 15 Start/Round; #X text 106 14 Stop; #X text 249 176 Input Stage; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 1 4 1; #X connect 1 1 8 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 9 0; #X connect 7 0 9 1; #X connect 8 0 9 1; #X connect 9 0 6 0; #X connect 9 0 6 1; #X connect 10 0 7 0;