Sensors for Interactive Music Performance
Yoichi Nagashima
( SUAC / ASL )
This workshop focuses the sensor technology for interactive music performance with some viewpoints. At first, I will introduce and demonstrate many types of sensors as interfaces between human and computer systems, not only as technically but also as artistically with multi-media works. Secondly, I will lecture to design, develop and produce sensing system, and lecture of handling sensor information to create interactive art with Max/Kyma environment. Thirdly, we will discuss the possibility of "new human interface" and the interactivity with multi-media technology. Finally, I and Tamami Tono (composer, SHO performer) will have a demonstration as a "small cncert" as the "live" application of the theme of this workshop.
In Japan (you know AKIHABARA ?), we can use easily the powerful microcomputer board with 32-bits CPU (clock 16MHz), 2 serial (MIDI/RS232C) ports, 8 channel 10-bits A/D, 40-bits or more Digital Ports, 2 channel 10-bits D/A, 5 channel 16-bits counters, 128KB FlashEEPROM, 8KB RAM and more. It costs only $30. I have produced many original MIDI equipments in a part of my composition. We call this "AKI-H8".
I have little time to explain about this development , but many musician or artists (not specialists in Electronics or IT) in Japan develop their original MIDI equipments with my Japanese WebPage . There are many sample circuits and sample AKI-H8 source codes and binary codes runnable directly. If you want to study this, please study Japanese at first.
Synth.scope({ var p111,p112,p113,p116,p117,p118; var s, z, y, ss, zz, yy; var p106,p107,p108,p109,p110,p114,p115; var p119,p120,p121,p122,p123,p124,p89,p90,p91,p92,p93,p94; var p95,p96,p71,p72,p73,p74,p75; p108 = MIDIController.kr(16,108,0.0,2.5,'linear'); // [A] Res LPF level p106 = MIDIController.kr(16,106,100,4000,'exponential'); // LPF cutoff p107 = MIDIController.kr(16,107,0.01,0.6,'linear'); // Q p95 = MIDIController.kr(16,95,1.5,2.0,'linear'); // chaos param p96 = MIDIController.kr(16,96,-1.0,1.0,'linear'); // pan p71 = MIDIController.kr(16,71,0.0,2.5,'linear'); // [B] Res LPF level p72 = MIDIController.kr(16,72,100,4000,'exponential'); // LPF cutoff p73 = MIDIController.kr(16,73,0.01,0.6,'linear'); // Q p74 = MIDIController.kr(16,74,1.5,2.0,'linear'); // chaos param p75 = MIDIController.kr(16,75,-1.0,1.0,'linear'); // pan p109 = MIDIController.kr(16,109,0.0,5.0,'linear'); // [A] Synth level p110 = MIDIController.kr(16,110,0.01,0.5,'linear'); // echo depth p111 = MIDIController.kr(16,111,0.05,1.5,'linear'); // pulse density p112 = MIDIController.kr(16,112,30,400,'exponential'); // base freq p113 = MIDIController.kr(16,113,0.0,1.0,'linear'); // freq random range p114 = MIDIController.kr(16,114,0.0,5.0,'linear'); // [B] Synth level p115 = MIDIController.kr(16,115,0.01,0.5,'linear'); // echo depth p116 = MIDIController.kr(16,116,0.05,1.5,'linear'); // pulse density p117 = MIDIController.kr(16,117,70,1000,'exponential'); // base freq p118 = MIDIController.kr(16,118,0.0,1.0,'linear'); // freq random range p119 = MIDIController.kr(16,119,0.0,7.0,'linear'); // [A] Noise Level p120 = MIDIController.kr(16,120,0.1,15.0,'exponential'); // noise pan rate p121 = MIDIController.kr(16,121,0.0,1.0,'linear'); // noise pan depth p122 = MIDIController.kr(16,122,1.5,2.0,'linear'); // chaos param p123 = MIDIController.kr(16,123,0.01,0.6,'linear'); // filter Q p124 = MIDIController.kr(16,124,300,2500,'exponential'); // filter cutoff p89 = MIDIController.kr(16,89,0.0,7.0,'linear'); // [B] Noise Level p90 = MIDIController.kr(16,90,0.1,15.0,'exponential'); // noise pan rate p91 = MIDIController.kr(16,91,0.0,1.0,'linear'); // noise pan depth p92 = MIDIController.kr(16,92,1.5,2.0,'linear'); // chaos param p93 = MIDIController.kr(16,93,0.01,0.6,'linear'); // filter Q p94 = MIDIController.kr(16,94,300,2500,'exponential'); // filter cutoff s = Mix.ar(Array.fill(10, { Resonz.ar(Dust.ar(p111,50), p112+(p113*1800.0.rand), 0.003)}) ); ss = Mix.ar(Array.fill(10, { Resonz.ar(Dust.ar(p116,50), p117+(p118*2500.0.rand), 0.003)}) ); z = DelayN.ar(s, 0.048); zz = DelayN.ar(ss, 0.048); y = Mix.ar(Array.fill(7,{ CombL.ar(z, 0.1, LFNoise1.kr(0.1.rand, 0.04, 0.05), 15) })); yy = Mix.ar(Array.fill(7,{ CombL.ar(zz, 0.1, LFNoise1.kr(0.1.rand, 0.04, 0.05), 15) })); 4.do({ y = AllpassN.ar(y, 0.050, [0.050.rand, 0.050.rand], 1) }); 4.do({ yy = AllpassN.ar(yy, 0.050, [0.050.rand, 0.050.rand], 1) }); Pan2.ar( RLPF.ar( Crackle.ar(p95,1.0), p106, p107, 1.0, 0 ), p96, p108 ) + Pan2.ar( RLPF.ar( Crackle.ar(p74,1.0), p72, p73, 1.0, 0 ), p75, p71 ) + ( p109 * (s + ( p110 * y ) ) ) + ( p114 * (ss + ( p115 * yy ) ) ) + Pan2.ar( Resonz.ar( Crackle.ar(p122,1.0), p124, p123, 1,0 ), SinOsc.kr(p120,0,p121,0), p119 ) + Pan2.ar( Resonz.ar( Crackle.ar(p92,1.0), p94, p93, 1,0 ), SinOsc.kr(p90,pi,p91,0), p89 ) })
Just like as SuperCollider, I use Kyma as the [slave] component of my work/system with [master] MAX. Above is the output of [SHO breath sensor] produced by myself. I composed a work [Visional Legend] for Tamami Tono Ito (composer, SHO player), and using the same concept for the work.
This is the 1998 version of the work, but you can read the newest 2001 version of the work Here.