Mehrstimmigkeit / Polyphony
(EN google-translate)
(PL google-translate)
Die arithmetischen Operationen bewirken eine dauerhafte Transformation. Sie lassen sich ungefähr bestimmten musikalischen Praktiken zuordnen:
|
The arithmetic operations bring about a permanent transformation. They can be approximately assigned to certain musical practices: |
|
Übung #2 / Exercise #2
Nachfolgender Sketch zeigt, wie unter Verwendung der Library ComposingForEveryone Mehrstimmigkeit erzeugt werden kann. Erweitern Sie den Sketch auch unter Verwendung des vorangehenden Sketches BASIC_Sound_Of_N_simplified so, dass mit AOG ein mehrstimmiges Stück erzeugt wird. Hinweis: Verwenden Sie für jede Stimme immer den gleichen Tick t, aber jeweils andere arithmetische Operationen. Werfen Sie auch einen Blick auf den Sketch CFE bei den Beispielen zu ComposingForEveryone.
The following sketch shows how to create polyphony using the ComposingForEveryone library. Extend the sketch also using the previous sketch BASIC_Sound_Of_N_simplified so that a polyphonic piece is created with AOG. Note: Always use the same tick t for each voice, but different arithmetic operations for each. Also take a look at the CFE sketch in the ComposingForEveryone examples. |
import processchains.*; import processchains.wavfiles.WavLoader; import processchains.Pulse; import processchains.Utilities; int BPM = 216; Seq seq; public void setup() { //fullScreen(); // better for usage with an Android device size(640,480); // better for testing it on a PC. seq = new Seq(this); orientation(LANDSCAPE); frameRate(5); } int COUNTER=0; public void draw() { background(230,230,230); int voice = COUNTER%4; int frequency = 110*(COUNTER%13 +1); seq.play(voice, frequency, 40.0); COUNTER++; }
Code 0-1: Main tab of the Sketch "Polyphony".
import processchains.*; import processchains.wavfiles.WavLoader; import processing.core.*; public class Seq { WavInstrument[] inst; Instruments2Channel inst2chan; ChannelMapper channelmapper; Channel2Buffer channel2buffer; Soundcard soundcard; public double[][] volume = { {0.04,0.02}, {0.03,0.06}, {0.11,0.17}, {0.05,0.04} }; public double[][] volume_copy = { {0.04,0.02}, {0.03,0.06}, {0.11,0.17}, {0.05,0.04} }; public Seq(PApplet pap) { int number_of_channels = 2; int sample_rate = 44100; int buffer_size = 512; int max_poly = 100; int instrument_specification_index = 1; //piano 2 [0..20] inst = new WavInstrument[4]; //EXPERIMENT 3: TRY OUT VARIOUS SOUND COMBINATIONS inst[0] = new WavInstrument(pap,number_of_channels,sample_rate,0,1,max_poly,12,4000,2000,0.0); //viol_p_ton inst[1] = new WavInstrument(pap,number_of_channels,sample_rate,0,1,max_poly,33); //vibraphone_ton inst[2] = new WavInstrument(pap,number_of_channels,sample_rate,0,1,max_poly,7); //bass1_ton inst[3] = new WavInstrument(pap,number_of_channels,sample_rate,0,1,max_poly,30,100,41,-10.0);//clar3_long_ton inst[3].setMidimin(55); inst[3].setMidimax(79); for(int i=0;i<inst.length;i++) inst[i].setSource(volume[i]); inst2chan = new Instruments2Channel(sample_rate,buffer_size,number_of_channels); inst2chan.setSource(inst); channelmapper = new ChannelMapper(new int[] {0, 1}); channelmapper.setSource(inst2chan.getSink()); inst2chan.registerSuccessor(channelmapper); channel2buffer = new Channel2Buffer(sample_rate,buffer_size,number_of_channels); channel2buffer.setSource(channelmapper.getSink()); channelmapper.registerSuccessor(channel2buffer); soundcard = new Soundcard(sample_rate,buffer_size,number_of_channels); soundcard.setSource(channel2buffer.getSink()); channel2buffer.registerSuccessor(soundcard); } public boolean play(int voice, int frequency, float VELOCITY) { int midi = Utilities.freq2mid(frequency); if(midi>=inst[voice].getMidimin() && midi<=inst[voice].getMidimax()) { if(voice==3 ) inst[voice].stop(200); //violine / organ / clar EXPERIMENT 4: STOPPING OR NOT BEFORE NEXT TONE //if(voice==0 ) // inst[voice].stop(200); //violine / organ / clar EXPERIMENT 4: STOPPING OR NOT BEFORE NEXT TONE inst[voice].play(midi,VELOCITY*(float)volume[voice][0],VELOCITY*(float)volume[voice][1]); return true; } else { return false; } } }
Code 0-2: Secondary tab of the Sketch "Polyphony", class Sequencer, again using other classes inside ComposingForEveryone.
Eine mögliche Lösung zu Übung 2 / a possible solution of exercise #2
import processchains.*; import processchains.wavfiles.WavLoader; import processchains.Pulse; import processchains.Utilities; int BPM = 216; Seq seq; public void setup() { //fullScreen(); // better for usage with an Android device size(640,480); // better for testing it on a PC. seq = new Seq(this); orientation(LANDSCAPE); frameRate(5); } int t=9000; public boolean selectiveDivisionAndPlay(int ff, int tt, int voice, float velocity) { int fff = 1; while(tt>=2 && tt%2==0 && ff>=2 && ff%2==0) {tt/=2;ff/=2;fff*=2;} while(tt>=3 && tt%3==0 && ff>=3 && ff%3==0) {tt/=3;ff/=3;fff*=3;} while(tt>=5 && tt%5==0 && ff>=5 && ff%5==0) {tt/=5;ff/=5;fff*=5;} while(tt>=7 && tt%7==0 && ff>=7 && ff%7==0) {tt/=7;ff/=7;fff*=7;} //VARIANT FOR SELECTIVE MULTIPLICATION: //double f = (double)fff; //f*=0.25; //VARIANT FOR SELECTIVE DIVISION: double f = (double)ff; f*=0.07; println(f); return seq.play(voice,(int)(f+0.5),velocity); } int ZUSATZFAKTOR=0; public void draw() { if(ZUSATZFAKTOR<24*33) { background(230,230,230); } else { background(230,0,0); return; } int BASE = 2*2*2*2*3*3*5*7; BASE = BASE * ((ZUSATZFAKTOR/24)%8+1); //slowly change basenumber ZUSATZFAKTOR++; int x1 = t*9; int x2 = t*12; int x3 = t*3; int x4 = t*6; boolean played1 = selectiveDivisionAndPlay(BASE,x1,0,60.0); boolean played2 = selectiveDivisionAndPlay(BASE,x2,1,60.0); boolean played3 = selectiveDivisionAndPlay(BASE,x3,2,60.0); boolean played4 = selectiveDivisionAndPlay(BASE,x4,3,60.0); if(!played1) { x1*=2; played1 = selectiveDivisionAndPlay(BASE,x1,0,40.0); } if(!played2) { x2*=8; played2 = selectiveDivisionAndPlay(BASE,x2,0,40.0); } if(!played3) { x3*=4; played3 = selectiveDivisionAndPlay(BASE,x3,0,40.0); } if(!played4) { x4*=16; played4 = selectiveDivisionAndPlay(BASE,x4,0,40.0); } if(!played1 && x1%2==0) { x1/=2; played1 = selectiveDivisionAndPlay(BASE,x1,0,20.0); } if(!played2) { x2%=8; played2 = selectiveDivisionAndPlay(BASE,x2,0,20.0); } if(!played3 && x3%4==0) { x3/=4; played3 = selectiveDivisionAndPlay(BASE,x3,0,20.0); } if(!played4) { x4%=16; played4 = selectiveDivisionAndPlay(BASE,x4,0,20.0); } t = t + 1; }
Code 0-3: Sourcecode for the main sketch of Polyphony2, which is a possible solution for exercise #2.
Sound of Polyphony2 on youtube.
Hinweise / Hints
|