Lemur-Spezialisten anwesend?

Dieses Thema im Forum "Controller & MIDI" wurde erstellt von serge, 1. April 2013.

  1. serge

    serge ||

    Wer kann mir beim Einstieg in die Lemur-Programmierung helfen?
     
  2. sushiluv

    sushiluv bin angekommen

    das manual ist wirklich sehr gut, ansonsten vielleicht eher spezfisch fragen und sagen wo es probleme gibt.
     
  3. serge

    serge ||

    Falls Du mit Manual den "Lemur-User-Guide-3.1.0.pdf" meine solltest, kann ich Deine Einschätzung nicht wirklich teilen: Es bleiben eine Menge Fragen offen, was vor allem daran liegen mag, dass grundlegende Konzepte (z.B. Vektoren) und wie man sie nutzt für Einsteiger in die Materie nur sehr spärlich erklärt werden. Oder gibt es noch ein anderes Manual?

    Es hätte auch sehr geholfen, wenn die Factory-Projects ausführlich erklärt werden würden – insbesondere die Tastatur "Masterkeyboard" aus dem Interface "_4_Keyboard" in "studio setup.jzml" gibt mir immer noch Rätsel auf, nämlich wie und vor allem warum aus den Vektorwerten für "scale" und "octave" letztlich Notenwerte werden.

    Zur eigentlichen Frage: Ich benötige eine monophone Tastatur mit Last-Note-Priority. Um die Anzahl der Objekte klein zu halten, möchte ich mir diese als Pad- oder Switches-Array bauen. Ein Oktavschalter soll auch dabei sein. Über setattribute(Pads, 'colors', color_array) habe ich die "Tasten" gemäß dem "Zebrastreifen"-Muster herkömmlicher Tastaturen eingefärbt (multicolor on). Nun möchte ich wie gesagt monophones Last-Note-Priority-Verhalten haben.

    Baue ich das über ein Switch-Array, bekomme ich dieses Verhalten ganz einfach über die Kombination des "Radio"-Properties mit dem "Paint"-Behavior. Nur leider gibt ein Switch-Array nicht aus, wie lange man welchen Schalter drückt. Ich habe also keine Notendauer.

    Also nehme ich das Pad-Array, das mir zwar die Notendauer gibt, das ich aber einfach nicht dazu kriege, einstimmig zu werden. Das Pad-Array hat drei Reihen zu je einer Oktave, die Reihenfolge der [x]-Werte habe ich auch so getauscht, dass der niedrigste Ton links unten und der höchste rechts oben liegt. Aber an der dazu notwendigen last-note-Logik scheitere ich. Kannst Du helfen?
     
  4. serge

    serge ||

    Eine dazu verwandte, aber hoffentlich leichter zu beantwortende Frage:
    Warum kann ich in diesem Pad-Keyboard per Oktavschalter nur in Schritten von drei Oktaven transponieren?
    Wie schaffe ich es, dass der Oktavschalter in Schritten von einer Oktave transponieren?


    Das illustriert meine Verständnisschwierigkeiten hinsichtlich der Interaktion von Vektorwerten und deren Umwandlung in Notendaten recht gut.
     

    Anhänge:

  5. Phil999

    Phil999 bin angekommen

    ich würde mir die Sachen angucken, die es schon gibt. Haste ja z.T. schon, aber eben, nicht ganz durchschaut. Wie ist die Transponierung beim "Advanced Keyboard" gelöst? Ich hatte mit dem Autor (Softcore) vor einiger Zeit mal eine Konversation über das Thema, er hatte auch viele Dinge noch nicht verstanden damals, und jetzt scheint er den Bogen raus zu haben. Braucht einfach seine Zeit.

    Leider kann ich mit Tastaturen nicht gross weiterhelfen. Ist auch nicht gerade die einfachste Sache in Lemur. Ausserdem habe ich persönlich schon gute Tastaturen aufm iPad mit MIDI out (SynthX, Seline, Orphion, SP), die lassen sich z.T. sogar skalieren zu grossen oder kleinen Tasten. Sachen, die einfach besser sind als man jemals in Lemur bauen könnte. Lemurtastaturen brauche ich höchstens mal zum was testen, und dann nehme ich etwas schon vorhandenes wie Claviamat.

    Was ich mir noch vorstellen könnte und es noch nicht gibt: ein Fader- oder Gestureobjekt, das 88 Pads horizontal verschiebt. Man spart sich so die Transponierungsscripte, und könnte ev. ganz gut spielbar sein.
     
  6. serge

    serge ||

    Ich bin auf das Nebeneinander mehrere solcher Tastaturen sowie verschiedener anderer, frei konfigurierbarer Fader und Regler angewiesen, daher helfen mir Lösungen anderer Hersteller nicht wirklich weiter.

    Bitte, wer kann mir in dieser Angelegenheit auf die geistigen Beine helfen?
     
  7. Phil999

    Phil999 bin angekommen

    stimmt, das Design mit drei Keyboardsreihen ist neu, das muss teilweise erst entwickelt werden.

    Also das Grundproblem ist, dass drei Oktaven in dem Array drin sind. Will man um eine Oktave transponieren, muss das Array um 12 Schritte verschoben werden. Das geht schon, aber das wird dann schon etwas haarig. Ausser Du weisst eine einfache Methode. Ich würde im Script mir erst mal die Position aller Einsen holen, 12 addieren, das Array resetten, und mit den neuen Werten beschreiben. Wäre mir zu umständlich, daher vielleicht besser drei Padsobjekte machen mit nur einer Reihe? Dann sparst Du Dir auch das Invertscript.

    Ist wie gesagt nicht so einfach. Funktioniert ja einigermassen so wie es jetzt ist, daher würde ich mir nicht den Kopf zerbrechen. Eines Morgens steht man auf und hat die Lösung.
     
  8. serge

    serge ||

    Mir wäre erstmal schon damit gedient zu verstehen, warum in dem vorliegenden Fall die Transponierung in Schritten von drei Oktaven erfolgt, und nicht in solchen von einer – denn die grundsätzliche Funktion ist sowohl in dem Factory-Layout als auch in meinem die gleiche: Der Oktav-Vektor wird mit dem Tastatur-Vektor multipliziert.
     
  9. Phil999

    Phil999 bin angekommen

    habe ich gerade versucht zu erklären. Das Array umfasst drei Oktaven, man muss also da Werte verschieben für nur eine Oktave. Nimm ein Monitorobjekt falls Du das noch nicht gemacht hast. Ich hab's mal probiert mit verschiedenen Methoden, aber man kommt vom einen ins andere. Gibt aber sicher eine elegante Lösung.
     
  10. serge

    serge ||

    Monitorobjekte habe ich schon zu hauf benutzt, sowohl für Oktave-Switcher als auch für die Pads (und auch für alle Elemente aus der Tastatur "Masterkeyboard" aus dem Interface "_4_Keyboard" in "studio setup.jzml")

    Gefallen ist der Groschen leider dennoch nicht, denn im Fall der Tastatur "Masterkeyboard" aus dem Interface "_4_Keyboard" in "studio setup.jzml" fehlt mir nach wie vor das grundlegende Verständnis, wie und vor allem warum aus den Vektorwerten für "scale" und "octave" letztlich Notenwerte werden. Denn in diesem Beispiel ist das zusammengesetzte Pad-Array ja nur eine Oktave groß, sprich: Da können gar keine Vektorwerte verschoben werden. Wie geht das (um den Titel einer Heftreihe aus dem Beginn der 80er Jahre zu zitieren)?
     
  11. Phil999

    Phil999 bin angekommen

    mit einem 12er Array ist es einfach, man multipliziert mit dem Oktavschalter. Beim 36er Array muss man dann eben im Array was machen. Darum auch der Vorschlag, drei 12er anstatt ein 36er Array. Hat dann allerdings den Nachteil, dass man für jede Reihe neu ansetzen muss, was möglicherweise unerwünscht ist.

    Aber das 36er Ding geht schon, allerdings habe ich mir jetzt auch den Kopf zerbrochen, bin noch auf keinen grünen Zweig gekommen.
     
  12. serge

    serge ||

    Hiermit hattest Du recht:
    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…
    …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.
     
  13. Phil999

    Phil999 bin angekommen

    gratuliere, das sieht ziemlich optimal aus. Ich habe da mit nonull() hantiert, und das wäre ziemlich komplex geworden mit mehreren gedrückten Tasten bzw. Pads.

    Das ist das Schöne an Lemur, oder allgemein an programmierbarer Software. Man kann neue Sachen erfinden. So eine Dreiertastatur gab es soviel ich weiss noch nicht.

    Den seinen schenkt's der Herr im Schlaf ... das ist schon so. Schon als Kind fiel mir auf, dass man sich, z.B. bei einer komplizierteren Legokonstruktion, ab einem gewissen Punkt nicht mehr weiterbewegt. Man hat alle Möglichkeiten zigmal durchprobiert und weiss eigentlich, dass es so gar nicht gehen kann. Dann lässt man's liegen und macht etwas anderes. Aber es lässt einem doch keine Ruhe, und die ständige Beschäftigung mit dem Problem bleibt auch während des Schlafes aufrecht. Und plötzlich, manchmal schon am nächsten Tag, wacht man mit der fertigen Lösung auf. Das nur so nebenbei, ich finde es einfach auch interessant, wie der menschliche Geist funktioniert.

    Lemur kann einem öfters mal in so eine Situation treiben. Man ist nah dran, aber es läuft nicht wie gewollt. Da habe ich mir schon angewöhnt, gar nicht mehr lange herumzumachen, sondern es einfach bleiben lassen. Man liest dann einen Forumsbeitrag, stöbert im Handbuch, oder wacht mit einer Idee auf, das kommt oft von alleine.
     
  14. serge

    serge ||

    Danke – Anteil an der morgendlichen Erleuchtung hatte sicherlich diese Lektüre vor'm Einschlafen:
    http://www.jazzmutant.com/workshop_tutorialslist.php?id=storing
    mit diesem Bild
    [​IMG].
    und diesem Text:
    "More specifically, we indicate the position within the presets array from where the MultiSlider's values (a vector containing 16 values) should be written."
    Das brachte den Stein ins Rollen, wie man so sagt.

    Eigentlich schade, dass diese Tutorials so versteckt auf den Seiten der Lemur-Hardware vor sich hin schlummern.

    Mit Lego und dem damals aufkommenden Technic-Lego habe ich seinerzeit Ende der Siebziger, Anfang der Achtziger auch jede Menge Spaß gehabt und Knobeleien genossen.
     
  15. Phil999

    Phil999 bin angekommen

    ja, die alten Tutorials haben's in sich. Es wird im Liine-Forum oft darauf verwiesen. Sind ja eigentlich die einzigen Tutorials, die es gibt.

    Ich muss aber gestehen, dass ich nicht ganz durchblicke mit den Arrays. Kein Wunder, dass ich in der Neuauflage meines Cubasetemplates mit dem Speichersystem Mühe habe. Ich habe hier in diesem Prozess einiges dazulernen können. Darum umsomehr Gratulation zu Deinem Erfolg, zu Deiner Neukreation!
     

Diese Seite empfehlen