Möglichkeiten der ODF Programmierung

    • Offizieller Beitrag

    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.

    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 ?!
    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.

    Wurde über solche Dinge seitens der GO-Entwickler schon diskutiert? Was wäre evtl. mit wenig Aufwand realisierbar?

  • Code
    for( i=0; i<$numKeys; i++ )
    {
    [gray]____[/gray]Pipe[i] =.\OrganInstallationPackages\001161\HW\Bourdon16\[i].wav
    }

    Hmm, sowas?
    Ich denke nicht dass die ODF dafür der richtige Platz ist, das wäre eher was für einen ODF-Generator.

    Allerdings wünschte ich mir auch Variablen, es wäre sehr sinnvoll bei den Platzräubern wie PipeXXX-Blöcken ein Muster definieren zu können, statt statisch jede einzelne Pfeife anlegen zu müssen.

    Vor dem Hintergrund gleich mal eine Frage:
    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.

    Gruß,
    Michael

    • Offizieller Beitrag

    Die Schleife für die Pfeifendefinitionen wäre sicher eine Möglichkeit von vielen.

    Aber auch eine Struktur wie if...then...else würde manche Möglichkeit bieten, besser interaktiv auf die Eingaben am Spieltisch reagieren zu können.
    [hr] if Mixturenabsteller=true then

    [white]______[/white]ignoriere alle Mixturen bei der Soundausgabe, egal wie sie gerade registriert sind

    elseif 16Fußabsteller=true

    [white]______[/white]ignoriere alle 16Fuß-Register bei der Soundausgabe, egal wie sie gerade registriert sind

    else

    [white]______[/white]dann ganz normal wie immer

    endif
    [hr]
    solche Probleme habe ich gerade bei Doesburg. Bei HW scheint so etwas zu funktionieren. Man kommt mit dem Auslösen jedes Abstellers, fester Kombination oder Creszendo anstandslos wieder zur letzten Einstellung der Handregistrierung zurück.

  • 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.

  • 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-)


  • 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

    Original geschrieben von martin
    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.

    Sowas ähnliches schwirrt mir schon länger im Kopf herum, aber um das alleine durchzuziehen habe ich momentan zu wenig Zeit.
    Da wg. PHP webbasiert könnte man das ganze sogar soweit erweitern dass man kollaborativ online ODFs generieren kann.

    Ich habe mir das so vorgestellt dass man eine ODF zum parsen hochlädt und eine E-Mail Adresse angibt zwecks Versand eines zufällig generierten Links und zufälligen Passwort falls man z.B. das Projekt löschen möchte.
    Den zufälligen Link gibt man an seine Mitstreiter weiter die dann nur noch für diese Sitzung ihren Namen eingeben müssen und los geht's. (Mozilla TogetherJS?)
    Das Editieren geschieht dann stilecht mit einer Maske für die möglichen Attribute, da kann man auch gleich anzeigen welche Attribute Pflicht sind und Hinweise anzeigen.
    Das ODF-Format ist ja gut überschaubar, die Doku müsste dann nur datenbankgerecht aufgearbeitet werden.
    Hat man seine Änderungen gemacht lädt man die neue ODF einfach herunter.
    Später kann man per HTML5 Canvas evtl. sogar die Spieltisch-Grafiken positionieren, aber das ist momentan zu krass.
    Sinnvoll wäre auch dass bei jedem Speichervorgang, soweit Änderungen geschehen sind, eine neue Revision in der Datenbank ablegt wird sodass man Änderungen rückgängig machen kann oder ältere Revisionen hervorkramen.

    Naja, ich wäre dabei.

    Gruß,
    Michael

    • Offizieller Beitrag
    Zitat

    Original geschrieben von martin
    Wie du schon geschrieben hast, ist die händische ODF Erstellung mühsam - jeder kluge Mensch wird zu einen Tool greifen.

    Da bin ich der Meinung GO selbst sollte das Tool sein, mit dem man einigermaßen mit vertretbarem Aufwand eine virtuelle Orgel definieren kann. Das jetzige ODF ist noch praktikabel bei kleineren Orgeln, vor allem wenn sie noch ohne Multirelease sind.

    Zugegeben ist nun Doesburg wirklich kein kleines Set. Da sieht es bis jetzt etwa wie folgt aus:

    (Im Moment werden nur die Front-Kanäle genutzt und auch ohne die Tremulantenranks)
    - Damit ist die ODF schon rund 2,6 MB groß und besteht aus ca 80.000 Textzeilen.
    - rund 2,5 MB entfallen nur auf die Definitionen der Pfeifen - jede Menge im Grunde fast redundanter Code !!
    - Die eigentliche Definition des Spieltisches in der ODF beträgt nur rund 66 kB - im Vergleich sehr wenig

    Und man bedenke - das ganze ist nur eine Text-Datei !

    Also da wäre ein einfacher Include einer externen Datei, die alle Ranks enthält schon eine sehr einfache Hilfe. Im Moment mache ich das eben jedesmal händisch mit dem Editor.

    Zitat

    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.

    PHP-Skripte verwende ich zur Erstellung der Pfeifendefinitionen - man darf sich aber nicht täuschen lassen, wie viele Unregelmäßigkeiten doch in den Sample-Strukturdaten der Sethersteller vorkommen können, die solch eine Automatik auch wieder ruckzuck aushebeln können. Bei Doesburg ist das zum Glück diesmal nicht der Fall, aber bei der Prag z.B. war das extrem. Dann kann man doch fast alles von Hand schreiben.

    Diese vielen Ausnahmen machen es m.E. auch fast unmöglich bzw. wenig sinnvoll, die komplette ODF mit einem Generator zu erzeugen. Da bläht sich der Aufwand zur Entwicklung des Tools schnell ins Unermessliche auf, das haben wir bei Wolfgangs ODF Generator erleben können.
    Allerdings wäre ich ohne die PHP-Skripte sicher noch Jahre beschäftigt diese ODF zu tippen - so ist aber schon Land in Sicht.

    Zitat

    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


    Allerdings werden ODFs dann nahezu unlesbar werden. Intelligenter wäre da, wenn man verschiedene Orgelbaugruppen auch verschiedenen Nummernkreisen zuordnen könnte, wie es die vergangenen Jahre z.B. gern mit der Nummerierung der Stops gemacht wurde: [Stop0xx] fürs Pedal, [Stop1xx] Manual1, [Stop2xx] Manual2 usw.

    Bei Ranks geht das wie gesagt leider garnicht und bei Koppeln z.B. nur mit recht kleinen Zahlen unter 100. Ich würde kein Problem sehen, die Nummerierungen grundsätzlich überall von 000 bis 999 frei wählbar zu gestatten, also damit auch ein [Coupler1xx] der auf das Manual1 bezogen ist. Man wird sowieso nie verhindern können, wenn ein Programmierer Blödsinn programmiert, auch nicht mit eingeschränkter Nummerierungsmöglichkeit.


    Zitat

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

    Auf diesen "Trick" bin ich schon damals bei der Rotterdam ODF gekommen. Allerdings ist das ja nicht so die saubere Lösung die ich mir wünschen würde. Ich mag auch den HW-Sets nicht irgendwelche eigenen wave-Dateien hinzufügen, also suche ich immer eine möglichst kleine, "unauffällige" wave die das Set von Haus aus mitbringt. Warum darf ich in einem Rank nicht einfach die Pfeifenzahl auf 0 setzen ?? In einer Orgel geht man doch auch nicht hin und baut eine einzelne zugestopfte Pfeife auf eine leere Reihe der Windlade :L

  • 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.

  • 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.

    • Offizieller Beitrag

    Die Definition des Spieltisches in der ODF ist so schon nicht schlecht wie es jetzt bereits ist. Irgendwas muss man dem Generator ja auch an Infos mitgeben damit er was daraus machen kann. Das ist im Prinzip dann sowieso wieder das was man auch gleich direkt in die ODF schreiben kann.

    Ich denke nicht, dass man hier viel Aufwand einsparen kann. Man nimmt sowieso Bausteine aus vorhandenen ODFs und kopiert vieles zusammen. Hier ist viel wichtiger, dass der ODF-Programmierer eben auch umfassende Kenntnisse von Orgeln hat und nicht nur vom Programmieren. Diese Kenntnisse hat auch ein Generator nicht wenn es ans Eingemachte geht. Die letzten, entscheidenden 5% "Intelligenz" werden ihm fehlen, denn es kommen mit jedem neuen Set auch wieder neue Problemstellungen auf einen zu.

    Der Mammutaufwand sind eigentlich nur die Pfeifendefinitionen - die bekommt man aber auch eher über eine Programmier-Routine in den Griff. Das sollte aber m.E. auch in GO möglich sein, ohne externe Tools bemühen zu müssen.

    Eine Schnittstelle zwischen Spieltisch und Ranks und irgend eine einfachere Art die Pfeifen zu definieren, die noch erfunden werden muss.

    Wenn man Variablen hätte für den Pfad zu den Pfeifen und für die Dateinamen und die Releases, dann wäre doch schon viel gewonnen. Bei Doesburg z.B. wiederholt sich dann alles sehr gleichmäßig mit genau 1 Loop-Datei + 2 Release-Dateien über sämtliche Ranks hinweg. Ein Rank mit Variablen definieren und dann alle Parameter noch als Liste eingeben und schon hat man 200 Ranks a 73 Pfeifen - denn Doesburg verwendet für die meisten Register satte 6 Oktaven voller Pfeifen :)

  • Oder ist es vielleicht doch zu überlegen, GO und die virtuelle Konsole in getrennten Programmen zu realisieren?

    Nur eine Idee:

    Rechts im Bildschirm eine Leiste mit Bauteilen für den virtuellen Spieltisch, die sich mit der Maus anordnen lassen. Nach dem Anordnen vielleicht nen Rechtsklick auf den Registerknopf...dann muss ein Pfad zum Sampleordner angegeben werden...und BUMM...nach Bestätigung kann ich das Register betätigen und es spielt.

    Das wär ein Wunschzustand...und gilt nur für meinen Geschmack, da mich das Aussehen des virtuellen Spieltisches herzlich wenig interessiert.

  • 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".

  • 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

  • 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:

    • Offizieller Beitrag

    Die Verzeichnisstrukturen einzulesen ist ein interessanter Ansatz, den auch schon Wolfgang mit seinem ODF Creator verfolgt hatte. Dazu hatte ich ihm schon die Scans von zahlreichen Samplesets zur Verfügung gestellt um diese zu analysieren. Leider treten von Set zu Set auch da immer wieder mal neue Unregelmäßigkeiten oder auch gänzlich andere Strukturen auf, in denen die Set-Hersteller ihre Sampledateien verwalten. Es gibt da leider keine Norm. Das hat zur Folge, dass auch die Routinen, bzw. Generator-Skripte immer wieder neu angepasst werden müssen.

    Bis jetzt verwende ich PHP-Skripte, die einfach die Codezeilen fortlaufend generieren. Das hat durchaus Vor- und Nachteile ebenso wie das Einlesen der Verzeichnisse Vor- und Nachteile hat. Es ist leider nicht so, dass einfach alle Dateinamen aus dem Verzeichnis 1:1 in Pfeifen-Definitionen gewandelt werden können. Teilweise handelt es sich bei den Dateien nicht um Samples sondern um alles Mögliche anderes, was der Beschreibung der Orgel dient, wie z.B. Grafiken, Geräuschsamples usw.
    Außerdem liegen immer wieder einzelne Pfeifen mit 2 oder mehr Loop-Sample-Dateien für den selben Ton vor. Hier muss man also ganze Dateien überspringen, sonst hat man aufeinanderfolgend mehrmals den selben Ton in die ODF übernommen.

    Auch die Release Dateien können an ganz unterschiedlichen Orten in den Verzeichnissen liegen. Teilweise ist das erste Release in der Loop-Attack-Datei bereits enthalten und die folgenden in extra Dateien, teilweise werden nur extra Dateien für die Releases verwendet. Die Unterverzeichnisse für Releases können auch ganz unterschiedlich organisiert sein. Manchmal ist auch die Release-Time nicht im Verzeichnisnamen angegeben, so dass dieser Wert erst mehr oder weniger erraten werden muss.

    Bei der angesprochenen problematischen ODF handelt es sich um das Set "Prague Baroque" von Sonus Paradisi. Im Prinzip läuft diese ODF bereits schon seit einiger Zeit, es ist aber noch einiges an Feinarbeit notwendig, und es gibt noch weitere Gründe, weswegen ich diese ODF im Moment noch nicht veröffentlichen möchte.
    Außer der teilweise willkürlichen Groß- und Kleinschreibung kamen noch die Probleme hinzu, dass das Original nur kurze Oktaven hat, die ODF aber voll chromatisch als erweitertes Set funktionieren sollte. Außerdem mussten alle fremden Zungen, deren Samples von einer ganz anderen Orgel in Wien stammen, manuell auf die exakte Stimmtemperatur der Prager Orgel gepitcht werden, um auch die originale Stimmung verwenden zu können.

    Nachdem wir hier nun so ein schönes Skript besitzen um die Verzeichnisse einzulesen, kann ich aber doch im Dateianhang die Verzeichnisstrukturen dieses Sets zur Verfügung stellen. Wenn man diese aufmerksam analysiert, wird so manches von dem oben geschriebenen deutlicher werden.

    Deshalb kann das Generator Skript mit Header von Martin so sicher noch nicht wirklich in der Praxis funktionieren.

    Der Ansatz, auch die "übrige" ODF mit in das PHP-Skript zu integrieren ist sicher noch einige Überlegung wert. Ich hatte das auch schon angedacht, aber mangels unzureichender Erfahrung mit PHP bis jetzt nicht umgesetzt. Aber aus dem Beispiel kann ich doch einiges lernen!

    In der Prag ODF verwende ich noch die Pfeifendefinitionen innerhalb der Stops. Das geht noch bei kleineren Orgeln. Für die kommenden ODFs der großen Sets habe ich beschlossen, zukünftig sämtliche Pfeifen nur noch in Ranks zu organisieren. Alle Ranks werden dabei zu einem Block zusammengefasst und derzeit ganz am Ende der ODF angehängt. Das schafft doch deutlich mehr Übersicht und Flexibilität. Deshalb auch der Wunsch, diese Ranks auch physisch vom Spieltisch zu trennen und aus der ODF auszulagern (Include).

    Auch für den Fall, alles nur noch in einem zentralen PHP-Skript zu verwalten, würde ich die Ranks als separaten Block in diesem Skript zusammenfassen. Was allerdings die Wartung anbetrifft, so ändert sich im Allgemeinen an den Pfeifen später nichts mehr, sodass diese eigentlich auch nicht unbedingt neu zu generieren wären.

    Es spräche aber auch noch einiges dafür, die Ranks eben gerade nicht zu integrieren, sondern als separaten Block getrennt vom Spieltisch zu belassen. Und zwar besteht dann die Möglichkeit, unterschiedliche "Rank-Blöcke" an diese "Spieltisch-ODF" zu binden. Nämlich zu Testzwecken während der Entwicklungsphase vollkommen leere Ranks ohne Pfeifen zu verwenden. Das vermeidet Ladezeiten, solange man z.B. nur an der Bildschirmgrafik bastelt.
    Weiterhin kann man so leicht einen Rank-Block erzeugen, der dann nur die Pfeifen beinhaltet, die das Demo-Set zur Verfügung stellt. Ein weiterer Rank-Block nur mit den Wet-Samples ohne "Surround-Ballast", ein Block für das volle Surround-Set und möglicherweise Blöcke um nur Teilorgeln für kleinere Spieltische bzw- PC´s laden zu können - alles ohne dann sämtliche unnötigen Register im GrandOrgue Menü deaktivieren zu müssen, was bei großen Sets doch ziemlich Aufwand bedeutet.

    Wichtig wäre hierfür aber eine Möglichkeit die Schnittstelle zwischen Spieltisch und Rank-Block einfach definieren zu können. Zwingend fortlaufende Ranknummerierung ist da eher etwas ungünstig. Auch Teilsets müssen die selben Ranknummern haben um zum Spieltisch zu passen. damit ergeben sich automatisch Lücken in der Rank-Nummerierung. Diese kann mein freilich mit den "leeren Ranks", wie ein paar Beiträge weiter oben beschrieben, füllen.

  • 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"); ?>

    • Offizieller Beitrag

    So - heute nochmal bei Tageslicht betrachtet, kommt schon mehr Klarheit auf :D

    Ich versuche mal zusammenzufassen:

    - Es wird eine Liste generiert, die lediglich alle Pfeifeninformationen eines einzelnen Ranks beinhaltet
    - Zur Erzeugung dieser Liste gibt es eine "Library" mit Funktionen
    - Diese Funktionen werden mit den nötigen Übergabeparametern aufgerufen
    - in einer Funktion davon wird die Groß- Kleinschreibung mit dem tatsächlichen Pfad abgeglichen
    - Die Funktions-Library wird als Header dem eigentlichen ODF-Code vorangestellt
    - Die Liste der Pfeifeninformationen wird anstelle jeder Rank-Definition mittels PHP Code in den ODF-Code eingefügt
    - Mittels einer separaten Scan-Routine wird die Verzeichnis-Struktur des Sets zuvor in eine Datei eingelesen
    - Die so entstandene PHP-Quelldatei, die den ODF-Code enthält, wird zur ODF-Zieldatei compiliert
    - Das heißt, wir haben dann eine in GrandOrgue lauffähige .organ Datei generiert


    Vorteile gegenüber meiner jetzigen Methode:

    - Die Einzelkomponenten müssen nicht mehr von Hand zur ODF zusammengefügt werden
    - Bei konsequenter Anwendung ist nur die Wartung einer einzigen Source-Datei nötig
    - Unstimmigkeiten in der Groß- Kleinschreibung der Sample-Dateien werden automatisch korrigiert
    - Durch Erweiterung der Funktionen lassen sich evtl. auch andere Bereiche der ODF vereinfachen


    Neutral:

    - Der Gesamtaufwand zur Erstellung einer komplexen ODF ändert sich insgesamt nur unwesentlich
    - Es wird für den Laien dadurch auch nicht einfacher eine ODF zu erstellen


    Nachteile:

    - Es sind konkretere Kenntnisse in PHP bzw. einer anderen höheren Programmiersprache nötig


    Wie man sieht, überwiegen die Vorteile aber die Nachteile. Die PHP-Generatordatei zur kompletten Prague Baroque lässt sich übrigens vollkommen fehlerfrei zur lauffähigen ODF übersetzen :A

    Da hast Du Martin, mal wieder ganze Arbeit geleistet - da wird auch wieder klar, warum GrandOrgue bisher schon so gut werden konnte :-respect: