HelloAOG -- Workshop zu Arithmetic Operation Grammar (Deutsche Version)
(EN google-translate)
(PL google-translate)
english version, see:

Sketch für den Workshop am 03.06.2024:

Arithmetic Operation Grammar (AOG) ist als Kompositionsmethode jenseits der ausgetretenen Pfade klassischer Theorie, aber auch jenseits etablierter neuer Strömungen konzipiert worden [1],[2].
Damit kann diese Methode Laien einen alternativen Zugang zum Komponieren geben. Einen einfachen Zugang zum Komponieren auch für Laien zu gewährleisten, ist wiederum unter anderem auch Ziel der Bewegung Ubiquitous Music, weshalb es bereits einige Beiträge mit AOG auf dem jährlichen Symposium zu Ubiquitous Music gegeben hat [3],[4],[5].
Nun stellt sich die Frage, wie man eine solch abseitige Technik didaktisch sinnvoll vermitteln kann, die sich an keine der etablierten Strukturen anlehnt. Der vorliegende Workshop nimmt als Ausgangspunkt das Programmieren in Java/Processing. Strukturen von AOG werden zunächst als Java-Code vorgestellt und danach in kompakterer Weise durch die Sprachmittel von AOG ersetzt. Das Bekannte, aus dem heraus das Neue entwickelt wird, ist also keine musikalische Theorie, sondern eine Programmiersprache. Dies ist aufgrund der besonderen Eigenheiten von AOG machbar, die im folgenden kurz vorgestellt werden:
|
Literatur





Warum kann man sagen, dass die Folge der natürlichen Zahlen eine musikalische Struktur hat?

Bild 0-1: Inner prime-factor-structure of natural numbers.

Bild 0-2: Inner prime-factor-structure of natural numbers2.
1. Getting Started

|
Wenn Sie den Sketch erfolgreich gestartet haben bekommen Sie folgendes zu sehen und zu hören:

Bild 0-3: Screenshot des laufenden Programms HelloAOG.


Der ganze Workshop ist so aufgebaut, dass es in der Regel reicht, im Haupttab des Sketches zu arbeiten. Die anderen Tabs brauchen Sie nicht zu beachten und sie werden hier auch nicht besprochen. Im Haupttab finden Sie vordefinierte Variablen und die setup()- und die draw()-Methode. Zunächst im konkreten Fall wären das die nachfolgend dargestellten Code-Zeilen:
//version: HelloAOGdev020_workshop_BASIS 27.05.2024 int NUMBER_OF_VOICES=1;//4; //Try to vary if stuttering in sound appears: int SAMPLE_RATE=11025; //8000 11025 22050 44100 48000 int BUFFER_SIZE=16; //16 32 64 128 256 512 public void setup() { size(640,480); frameRate(2); configure(); } public void draw() { vis.draw(); vis.step(); A=2520/(T%7+2); tone1.play(A,100); T++; }
Code 0-1: HelloAOG
Erläuterungen:
|
A=2520/(T%7+2); tone1.play(A,100); T++;
Code 0-2: Letzte drei Zeilen der draw()-Methode.
|
Mehr Erläuterungen:
|
Falls Ihr Computer den Sound nicht richtig darstellt, könnten Sie versuchen das Problem durch Änderung der Sample-Rate und der Puffergröße zu beheben, siehe Sketch. Eine andere Möglichkeit wäre, zu versuchen dem Java-Prozess eine höhere Priorität zu geben. Schließlich wäre auch möglich, ein externes Midi-Device anzusteuern, anstatt den Sound mit Java-Mitteln direkt zu erzeugen. Hierzu wäre folgendes nötig (nur dann):
|

2. Ausnutzen der unendlichen Weite der natürlichen Zahlen
|
public void draw() { vis.draw(); vis.step(); A=2520; X=T; B=1; while(A>=2 && A%2==0 && X>=2 && X%2==0) {A/=2;X/=2;B*=2;} while(A>=3 && A%3==0 && X>=3 && X%3==0) {A/=3;X/=3;B*=3;} while(A>=5 && A%5==0 && X>=5 && X%5==0) {A/=5;X/=5;B*=5;} while(A>=7 && A%7==0 && X>=7 && X%7==0) {A/=7;X/=7;B*=7;} tone1.play(A,100); //AOG-Syntax: T,2520 //tone1.play(B,100); //AOG-Syntax: T.2520 T++; }
Code 0-3: Veränderte draw()-Methode: Extraktion der Primfaktoren 2,3,5,7 aus T und A, so weit es bei beiden geht.

3. Verwendung der generativen symbolischen Skriptsprache Arithmetic Operation Grammar (AOG) innerhalb von Java/Processing
|
|
public void draw() { vis.draw(); vis.step(); eval("2520/(T%7+2)a"); tone1.play(A,100); T++; }
Code 0-4: Beispiel von 1., jedoch unter Verwendung des AOG-Interpreters umgesetzt.

|
public void draw() { vis.draw(); vis.step(); eval("T,2520a"); tone1.play(A,100); T++; }
Code 0-5: Beispiel bei 2. mit AOG umgesetzt.
4. Ein komplexeres Beispiel mit vier Stimmen zyklisch aus Datei ausgelesen
|
123*(10-(T/48%10))p T/2*P%5+1*96+(3*96)a T/3*P%7+1*48+(3*48)*(T%2=0)*(T/2%6>0)b T/4*P%5+1*12+(3*12)*(T%4=0)*(T/3%4>0)c T/3*P%7+1*24+(3*24)*(T%3=0)*(T/4%3>0)d
Code 0-6: Inhalt der Datei aogscript.txt
Damit diese Dateil von AOG zyklisch interpretiert wird, kann das Hauptprogramm in folgneder Weise geändert werden:
Beachten Sie: NUMBER_OF_VOICES=4; und frameRate(8);
//version: HelloAOGdev021 27.05.2024 int NUMBER_OF_VOICES=4;//4; //Try to vary if stuttering in sound appears: int SAMPLE_RATE=11025; //8000 11025 22050 44100 48000 int BUFFER_SIZE=16; //16 32 64 128 256 512 public void setup() { size(640,480); frameRate(8); configure(); } public void draw() { vis.draw(); vis.step(); evalFile("aogscript.txt"); tone1.play(A,100); tone2.play(B,150); tone3.play(C,200); tone4.play(D,250); T++; }
Code 0-7: Modifizierter Haupttab zur Interpretation einer Datei.


Bild 0-4: Screenshot zu HelloAOG_4
Erläuterungen
|

|
5. Übung
Aus einer Keimzelle wird nach und nach in mehreren Schritten eine Komposition entwickelt, indem strukturelle Ideen als Veränderungen im Code implementiert und anhand des klanglichen Feedbacks immer wieder kontrolliert und korrigiert werden.
Einige Zwischenstation werden nachfolgend gezeigt.
Als Übung können Sie versuchen, diese Zwischenstationen als Ausgangspunkt für eigene, neue Entwicklungen zu benutzen.
Um das klangliche Feedback so ansprechend wie möglich zu gestalten, wurde eine etwas erweiterte Version der Software benutzt, die ein Disklavier ansteuert und dort auch die Möglichkeit bietet, das Sustain-Pedal zu steuern, das Tempo zu ändern und die Frequenzen vor ihrer Umwandlung in Miditöne mit einem prozentualen Faktor zu multiplizieren. Der Code lässt sich von diesen Besonderheiten aber auch auf die oben gegebene Stand-alone-Softwareversion übertragen. Nachfolgend findet sich die verwendete Erweiterung der Software:

COMPROVIZATION#1
100p #P==Percent frequency = 0.01*PERCENT*A..H 127s #S==Sustain 0..127 60q #Q==Frame Rate FPS, BPM = FPS*20 T,2520a #Extract 2,3,5,7 in 2520 which are also in T and send to A
Code 0-8: COMPROVIZATION#1

COMPROVIZATION#2
100p #P==Percent frequency = 0.01*PERCENT*A..H 127s #S==Sustain 0..127 60q #Q==Frame Rate FPS, BPM = FPS*20 7*5*9*8*(T/6%6+1)i #I==changing base number T,Ik # K*(K>109)*(K<1639)*(T/12%3>0)a #set range, add breaks
Code 0-9: COMPROVIZATION#2

COMPROVIZATION#3
100p #P==Percent frequency = 0.01*PERCENT*A..H 127s #S==Sustain 0..127 60q #Q==Frame Rate FPS, BPM = FPS*20 7*5*9*8*(T/6%6+1)i #I==changing base number T%6+9000+(T/96*96)u #Repetitions by controling time U,Ik # K*(K>109)*(K<1639)*(T/12%3>0)a #set range, add breaks
Code 0-10: COMPROVIZATION#3

COMPROVIZATION#4
T/36%10+1*60p #changing percentage T/48%2*127s #alternating sustain 60q #Q==Frame Rate FPS, BPM = FPS*20 7*5*9*8*(T/6%6+1)i #I==changing base number T%6+9000+(T/96*96)u #Repetitions by controling time U,Ik # K*(K>109)*(K<1639)*(T/12%3>0)a #set range, add breaks
Code 0-11: COMPROVIZATION#4

...und viele viele Iterationsschritte später:
COMPROVIZATION#5
T/24%10+1*(30+(T/48%5*5))p #smaller percentage T/48%2*60+60s #alternating sustain 15q #slower 7*5*9*8*(T/96%6+1)i T%(3+(T/3%3))+9000+(T/12*6)u #Repetitions by controling time T%6+9000+(T/24*12)v #varying time structure T%12+9000+(T/48*24)y #varying time structure T%24+9000+(T/96*48)z #varying time structure U+12w V+24x U/1*(U%1=0),(I*1)k #systematically introduce variations in other voices W/1*(W%1=0),(I*1)l V/2*(V%2=0),(I*2)m X/3*(X%3=0),(I*3)n K*(K>109)*(K<1639)*(U/12%3>0)a #set range, add breaks L*(L>109)*(L<1639)*(V/18%4>0)b M*(M>109)*(M<1639)*(Y/24%6>0)c N*(N>109)*(N<1639)*(Z/36%8>0)d
Code 0-12: COMPROVIZATION#5

LICENSE

Copyright 2024 Guido Kramann (website: http://www.kramann.info e-mail: kramann@th-brandenburg.de)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.