Beiträge von martin

    Ich habe nicht etwas wie den ODF Creator vom Wolfgang gemacht.

    Wenn man meinen Code genauer anschaut, sieht man, das ich einen gemischten, sehr einfachen Ansatz verfolge - ich gleiche nur Groß/Kleinschreibung automatisch ab. Die Anzahl der Release, Attacks, usw. wird im ODF Generator fix eingetragen - ähnlich wie es wahrscheinlich in deinen Generator-Skripts passiert.

    Die PHP Funktionen habe ich auf das hIngetrimmt, was für das ODF gebraucht wurde. Für ein anderes ODF wird man sie wahrscheinlich erweitern/anpassen müssen. Meiner Ansicht nach macht ein fixes Set von universal PHP Funktionen für alle ODFs diese nur unnötig kompliziert.

    Für das Konzept ist es egal, ob man die Pipe-Definitionen innerhalb von Ranks oder Stops stehen hat. Das Drumherum (inkl. Rank/Stop-Header) wird händisch gemacht und an der erwünschten Stelle der PHP-Code zum Generieren der Definitionen eingefügt.

    Für das Multi-Mode wäre mein Vorschlag die Nutzung von Parametern:

    Dann kannst du mit

    Code
    php organ.php nopipes > organtest.organ
    php organ.php demo > organdemo.organ
    php organ.php full > organfull.organ


    die unterscheidlichen Varianten in einer Quelldatei haben.

    Includes sind auch kein Problem. Speicher den Teil (auch inkl. PHP Code) in einer extra Datei ab.
    <?php include("datei.inc"); ?>

    Für das gewählte Beispiel reicht es meiner Ansicht nach, nur die Liste mit den Dateinamen zu automatisieren. Daher ist der Rest ein normales ODF.

    Das Generator-Skript beginnt mit den angehängten Header (Auszug als header.php an diesen Beitrag angehängt).

    Danach fängt ein normales ODF an:

    Es geht normal weiter (Manuale, usw.) , bis zum ersten Stop kommen.


    Der Stop fängt normal an, bis die Pipe-Definitionen kommen. Dann wird in den PHP Modus umgeschalten und die lange Listen mittels wenigen Codezeilen erzeugt. Je nach Register wird der Pfad, der Zeitpunkt der Releases und der Tonumfang angepasst.
    Der erste Befehl erzeugt die normale Liste (49 Einträge ab Pipe001 mit 36 als MIDI Note für Pipe001. Das Array enthält die Release-Zeitpunkt 123ms, 234ms und -1 für unendlich.
    Der zweite Befehl erzeugt 5 Einträge ab Pipe050, wobei er mit 73 als MIDI Note verwendet (dh. um eine Oktave versetzt).
    Um es einfach zu halten, habe ich PitchTuning/HarmonicNumber als händisch gewartete Eintrag nach der Liste hinzugefügt.

    So wird es analog für alle Stops gemacht.

    Der Code kümmert sich automatisch um die Groß/Kleinschreibung [schaut in der dir.lst nach].

    Zum Testen kompiliert man es mittels

    Code
    php organ.php > organ.organ

    Wenn man etwas ändern will, greift man nur ins PHP ein und wandelt neu um. Dadurch hat man nur etwas überschaubares zu warten.
    Ich wage zu behaupten, das man selbst das neue Monster-ODF von mps so ohne Includes usw. wartbar halten kann.

    OK, das war mein erste Vorschlag. Jetzt sind die anderen daran zu zeigen, wieso er nicht gut ist. :-confused:

    Ich habe Hilfemittel PHP (CLI - Kommandozeilen) gewählt (rein persönlich gründe - man könnte es in anderen Sprachen analog umsetzen).

    Das Problem mit der Groß/Kleinschreibung kann man technisch am besten lösen.

    Man braucht das angehängte Skript und wechselt in der Kommandozeile in das Verzeichnis, wo das .organ File liegen soll.

    Dann führt man

    Code
    php scan.php > dir.lst


    aus. Je nach System, muss man noch die Pfade zu scan.php bzw. den PHP Executeable (php.exe unter Windows) ergänzen.

    Das ganze generiert einfach eine Liste aller Dateinamen (mit vorliegender Groß/Kleinschreibung) in die Datei dir.lst

    Ich hatte vor ein paar Tagen unseren Admin um ein Beispiel seiner ODFs mit vielen Komplikationen gebeten.

    Meiner Ansicht nach kann man daran zeigen, das mein vorgeschlagener Weg praktikabel ist.

    Unser Admin will sein ODF noch nicht veröffentlichen - daher veröffentliche ich das gesamte Skript erst nach seinen Sanktus.

    Ausgangslage:
    * ca. 19200 Zeilen ODF
    * Erweiterung von vielen Registern durch umbiegen von anderen Tönen
    * Die Groß/Kleinschreibung der WAV-File hat kein System

    Im Endeffekt hat man 2549 Zeilen PHP Code, den man wartet und zu einen 19200 ODF "umwandelt".

    Das 80000 Zeilen ODF interessiert mich (wenn es fertig ist) - da baust du einen schönen Performance-Test für den GO Parser. :-O

    Schick mir mal so ein von dir selber erstelltes, großes .organ File mit lauter Sonderfällen.
    Entweder kann ich daran zeigen, wie man so etwas problemlos generiert oder ich lerne neue Problem daraus.

    Ich bin für eine Tool-Unterstützung beim Generieren, aber im Moment der Meinung, das etwas externes viel Flexibler/Besser ist.

    Zitat


    Da wg. PHP webbasiert könnte man das ganze sogar soweit erweitern dass man kollaborativ online ODFs generieren kann.

    Nichts webbasiert. Ich sehe PHP (CLI) in dem Zusammenhang nur als Makro-Prozessor, nach dem Muster:

    Das ganze dann in ein ODF kompilieren:

    Code
    php odf.php > odf.organ

    Im Echtfall wird man bei paar Funktionen definieren und es etwas komplexer aufziehen.

    Mit ein bisschen Logik ist das problemlos machbar.

    * Windlade A: Simulierter Tremulant a
    * Windlade B: Simulierter Tremulant b, WAV-basierter Tremulant c => wenn c on und b off, hat man WAV basiert. wenn b on und c off, hat man den normalen Tremulant.
    * Einen Schalter für den Tremulanten

    a bekommt den Schalter als Eingang.
    b bekommt den Schalter AND NOT (Register A OR Register B ....)
    c bekommt den Schalter AND (Register A OR Register B ....)

    Nachteil ist aber, das wenn man ein Register zieht, der Tremulant von Windlade B gewechselt wird.


    Also sind wir beim zweiten Thema.

    Die Fähigkeiten von GO entsprechen im Moment am ehesten einer elektrischen Registertraktur, wobei der Setzer/Walze die Registerschalter bewegt.

    GO hat keine prozedurale Sprache dazu - man kann aber zustandfreie Logik einbauen. Für ein Nutzungsbeispiel vgl. meinen Verweis auf die Best-Practices für Geräusche. Absteller (in der Art von Sperrventilen) sind dort beschrieben.

    Du hast:
    * Schalter (Switch ohne Funktionsangabe)
    * Logik-Element (Switch mit Funktion AND, OR, NOT, usw.)
    * Anzeigen (der Zustand von jeden Switch, egal ob Schalter oder Logik kann aufs Panel gelegt werden)
    Für jemanden mit Elektrotechnik-Grundkenntnissen sollte es kein Rätsel darstellen.

    Es ist mit voller Absicht nur zustandfreie Logik erlaubt. Die Generierung von Flip-Flops, usw. wird dadurch verhindert, das für Switches nur Switches mit kleiner Nummer als Eingang zulässig sind.

    PS:
    Generals/Divisionals könnte man als eine andere Art von Absteller nutzen: Mit "Protected" geschützt und sie ändern nur den Zustand von gewissen Registern.

    Zitat


    Immer wieder, vor allem bei sehr großen ODFs, würde ich mir doch die eine oder andere zusätzliche Möglichkeit der Programmierung einer ODF wünschen z.B.:

    - Include von Dateien
    - Definition von Konstanten
    - Globale Variablen
    - einfache Anweisungen, Sprungfunktionen, Verzweigungen, Schleifen usw.
    - leichte arithmetische Operationen

    Vor allem die Definitionen zu den Samples nehmen mittlerweile den weitaus größten Teil einer ODF ein und sollten deshalb ausgelagert werden können. Außerdem wäre es gut, diese ganzen Ranks von der übrigen ODF aus mit einer quasi "Standardschnittstelle" bedienen zu können. Quasi so, dass man einen "Standardspieltisch" mit einem beliebigen "Pfeifenwerk" verbinden kann.


    Das Thema sollte getrennt werden. Ich gehe hier einmal nur die ODF Generierung ein.

    Zitat


    Für diesen Ansatz ist es etwas schade, dass die Ranks grundsätzlich fortlaufend nummeriert sein müssen. Damit ist ein flexibles, strukturiertes Vorgehen schwierig. Bei den Stops dagegen ist die fortlaufende Nummerierung nicht notwendig, weshalb also dann gerade ausgerechnet bei den Ranks ?!

    Stops sind ein "Relikt" aus HW1 Format. Ranks sind neuer. Mit solch freien Namen kann man mehr Blödsinn machen, zB eine Stop-Sektion an 2 Manuale hängen.

    Wie du schon geschrieben hast, ist die händische ODF Erstellung mühsam - jeder kluge Mensch wird zu einen Tool greifen.
    Persönlich würde ich wahrscheinlich auf PHP zurückgreifen und ein Skript schreiben, was das komplette ODF generiert. Nicht redundante Passagen würde ich 1:1 durchschicken - für den Rest auf PHP zugreifen. Jede Änderung würde nur über das PHP passieren - das ODF nie direkt geändert.

    Damit hat man alle geforderten Möglichkeiten, um ein ODF zu erstellen.

    Mit der Zeit hat man auch einen Baukasten an Funktionen, die man wiederverwenden kann. Mit der Nummerierung sehe ich weniger ein Problem, weil ein Baukasten die Nummervergabe übernehmen kann.

    Zitat


    Es gibt auch bei realen Orgeln durchaus leere Reihen auf den Windladen, die später noch mit Pfeifen bestückt werden könnten. Dieser Umstand ist in GO m.E. bisher noch ungenügend abgebildet.

    Ein leeres Rank kannst du auch machen. Setzt die Pfeifenanzahl auf 1 und lade ein WAV mit Stille 8-)

    Zitat


    hat jemand schon mal darüber nachgedacht ein Netbeans/Eclipse/etc. Plugin für GO-ODFs zu stricken?
    Allein wenn man Objekt-Blöcke zuklappen und zu den verschiedenen Objekten springen könnte
    wäre das schon ein großer Dienst für die Übersichtlichkeit und Editierbarkeit.

    ODF entspricht den INI Format => aus der Richtung könnte es etwas geben.

    Die Initial-MIDI Configuration gibt es noch immer (und es gibt Verteidiger). Also wird man damit leben müssen - Es steht euch frei, die GO devel Mailing-Liste von der Unnötigkeit der Initial MIDI Configuration zu überzeugen.

    Im ODF steht keine MIDI Channel, sondern nur:
    * Zuweisung eine Manual/Enclosure-Nummer, die lt. Intial-Midi Config in einen MIDI Kanal verwandelt wird.
    * Für Stops & Co steht nur eine Nummer, die mit den Channel + Event-Typ dafür aus der Initial-MIDI Config verbandelt wird.

    Default für Stop Change ist Note on, Channel 5. Ich nehme an, dein Keyboard sendet auf Kanal 5.

    Stell das Event auf None in der Initial MIDI Config und für alle noch nie gespeicherten Orgeln ist das Problem weg.
    Bei gespeicherten entweder korrigieren und alles mit "Revert to Defaults" zurücksetzen.
    :