Hiermit hattest Du recht:
Phil999 schrieb:
Eines Morgens steht man auf und hat die Lösung.
Genauso war's heute morgen – aufgewacht, nachgedacht und auf einmal endlich (!) verstanden, wie diese Transponierung grundsätzlich funktioniert und eine Lösung für mein Problem gefunden, die Deinen Hinweis…
Will man um eine Oktave transponieren, muss das Array um 12 Schritte verschoben werden.
…in die Tat umsetzt und angenehm kompakt ist:
vel=replace(stretch(0, 84), invert, firstof(octave.y)*12)
Freu, radschlag, herumspring, Erikative zuhauf gebrauch!
Hier die ausführliche Erklärung für diejenigen, die es interessiert – vielleicht hilft es jemanden in vergleichbarer Situation:
- Ich möchte eine Drei-Oktaven-Tastatur aus Pads bauen, die aus drei Reihen zu je zwölf Pads besteht, tiefste Tonhöhe links unten, höchste rechts oben.
- Da die höchsten Tonhöhen bei Pad Arrays per Default aber links oben und die tiefsten rechts unten sind, sortiere ich die Pads über eine lokale Objekt-Variable namens "invert" neu.
invert={x[24], x[25], x[26], x[27], x[28], x[29], x[30], x[31], x[32], x[33], x[34], x[35], x[12], x[13], x[14], x[15], x[16], x[17], x[18], x[19], x[20], x[21], x[22], x[23], x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11]}
- Ich möchte neben der Tastatur einen senkrecht stehenden fünfstufigen Oktavschalter haben, der die vom Pad Array erzeugten Noten in Ein-Oktavschritten transponiert. Dieses Switch Array heisst "octave".
- Da bei Switches die automatisch vergebenen Schalter-Nummern von links nach rechts vergeben werden, ich aber eine Verteilung von unten nach oben wünsche, sortiere ich die Switches über eine lokale Objekt-Variable namens "y" neu.
y={x[4], x[3], x[2], x[1], x[0]}
- In dem Pad-Array wird die vorgefertigte "vel"-Variable wie folgt definiert:
vel=replace(stretch(0, 84), invert, firstof(octave.y)*12)
- "stretch" erzeugt einen Vektor mit 84 Plätzen für die 84 Noten, die 7 Oktaven ergeben. Alle 84 Plätze werden mit 0 gefüllt. Sozusagen eine 7-Oktaven-Tastatur, auf der keine Taste gedrückt ist.
- "firstof" sagt, welcher der fünf Schalter (Null bis Vier) im "octave"-Array gedrückt ist. Das "octave"-Array ist so eingestellt, das nur ein Schalter zu einer Zeit gedrückt sein kann, der zuletzt gedrückte gewinnt.
- "firstof" mal 12 ergibt dann die Position, ab der die Werte im "invert"-Vektor die Werte im "stretch"-Vektor mittels "replace" ersetzen.
- Oder um Bild der Tastatur zu bleiben: Damit wird bestimmt, wo innerhalb meiner 7-Oktaven-"stretch"-Tastatur die 3-Oktaven-"invert"-Pads liegen, also welchem Bereich der 7-Oktaven-Tastatur die 3-Oktaven der Pads entsprechen.