https://wikide.openmpt.org/api.php?action=feedcontributions&user=Cubaxd&feedformat=atom
OpenMPT-Wiki - Benutzerbeiträge [de]
2024-03-28T08:55:38Z
Benutzerbeiträge
MediaWiki 1.35.14
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=1133
OpenMPT-Wiki:Werkstatt/MPTPatterns
2011-03-25T14:39:41Z
<p>Cubaxd: </p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese MediaWiki-Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns. Sie wurde speziell für das deutsche OpenMPT-Wiki geschrieben, kann aber auch überall sonst verwendet werden.<br />
<br />
== Bekannte und mögliche Probleme ==<br />
* Anscheinend ist die Extension nicht mit der Collection-Extension kompatibel. Pattern-Tags werden nicht konvertiert.<br />
<br />
* Durch die vielen &lt;span&gt;-Tags wird der HTML-Code, je nach Größe des Patterns, sehr groß.<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich.<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich und auch wahrscheinlich, dass der Code Bugs enthält.<br />
<br />
== Installation ==<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen<br />
* Die folgenden Dateien in <code>extensions/MPTPatterns</code> speichern:<br />
** <code>[[OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.php|MPTPatterns.php]]</code><br />
** <code>[[OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php|MPTPatterns.class.php]]</code><br />
** <code>[[OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php|MPTPatterns.settings.php]]</code><br />
* Den Inhalt von <code>[[OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.css|MPTPatterns.css]]</code> in der Seite [[MediaWiki:Common.css|MediaWiki:Common.css]] ablegen<br />
* In der <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Dies ist nur ein Beispiel für die Benutzung. Die Erweiterung enthält einige [[#Attribute|Attribute]], durch die sich die Darstellung beeinflussen lässt. Des weiteren lässt sich über die Settings-Datei das Programm bis ins Detail anpassen, ohne den Quellcode direkt manipulieren zu müssen (was allerdings dem Admin vorbehalten ist).<br />
<pre><br />
<pattern highlight="4" float="right" title="Ein Beispiel" format="IT" id="on" css="buzz"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
== Attribute ==<br />
<br />
Alle Werte von Attributen außer natürlich ''titel'' und die Attribute mit numerischen Parametern (X) sind case-insensitive.<br />
<br />
* '''id'''="''on''|''off''": Der ID-String (z.B. "ModPlug Tracker S3M") wird (nicht) angezeigt<br />
* '''format'''="''IT'' (Standard)|''MPT(M)''|''S3M''|''XM''|''MOD''": Effekthervorhebung<br />
* '''highlight'''="X": alle X Zeilen hervorheben<br />
* '''width'''="X": Die Breite des Ausgabebereichs selber festlegen.<br />
* '''css'''="''mpt'' (Standard)|''it''|''buzz''": Farbschema, Presets entsprechen ungefähr denen in OpenMPT. Eigene Werte können durch das Hinzufügen der entsprechenden CSS-Klassen benutzt werden.<br />
** '''title'''="beschreibung"<br />
** '''float'''="''left''|''right''"<br />
<br />
<br />
Wenn das Attribut ''id="off"'' übergeben wird, wird der ID-String nicht angezeigt. Fehlt diese ID in der Zwischenablage, nimmt OpenMPT automatisch an, dass der Inhalt ein Pattern im IT-Format ist. ''id="off"'' sollte also bei Patterns aus anderen Formaten nicht verwendet werden, außer man gibt über das Attribut ''format'' das Modul-Format an. Dieses Attribut wird nicht berücksichtigt, wenn ein ID-String vorhanden ist.<br />
<br />
== Test ==<br />
<br />
Als Beispiel wird der weiter oben beschriebene Pattern angezeigt:<br />
<br />
<pattern highlight="4" float="right" title="Ein Beispiel" format="IT" id="on" css="buzz"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php&diff=1132
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php
2011-03-25T14:28:35Z
<p>Cubaxd: </p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT-Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.settings.php==<br />
<pre><br />
<?php<br />
###############################################################################<br />
# MPTPatterns settings<br />
# (c)opyleft 2009,2011 cubaxd<br />
###############################################################################<br />
#<br />
# NOTE: There is in most cases no data check and no error message if you enter<br />
# flawy values! So be careful.<br />
#<br />
###############################################################################<br />
<br />
function MPTPatterns_settings($mpt) {<br />
<br />
# attribute names<br />
$mpt->env['attribute']['format'] = 'format';<br />
$mpt->env['attribute']['title'] = 'title';<br />
$mpt->env['attribute']['css'] = 'css';<br />
$mpt->env['attribute']['identifier'] = 'id';<br />
$mpt->env['attribute']['highlight'] = 'highlight';<br />
$mpt->env['attribute']['float'] = 'float';<br />
$mpt->env['attribute']['width'] = 'width';<br />
<br />
# attribute values<br />
$mpt->env['txt']['on'] = 'on';<br />
$mpt->env['txt']['off'] = 'off';<br />
$mpt->env['txt']['left'] = 'left';<br />
$mpt->env['txt']['center'] = 'center';<br />
$mpt->env['txt']['right'] = 'right';<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// BEHAVIOUR<br />
///<br />
<br />
# limits<br />
$mpt->env['maxchannels' ] = 8; # limit the number of channels<br />
$mpt->env['maxrows' ] = 64; # max number of rows in a pattern<br />
<br />
$mpt->env['stdhighlight'] = 0; # standard: highlight every 'X'th row<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// CSS<br />
///<br />
<br />
# CSS class names<br />
# parent (div)<br />
$mpt->env['class']['frame'] = 'mpt';<br />
# children (span) the shorter the names the better<br />
$mpt->env['class']['title'] = 'title'; // (div)<br />
$mpt->env['class']['id'] = 'id';<br />
$mpt->env['class']['highlight']= 'hig'; // bg only<br />
$mpt->env['class']['note'] = 'not';<br />
$mpt->env['class']['instr'] = 'ins';<br />
$mpt->env['class']['global'] = 'glo';<br />
$mpt->env['class']['panning'] = 'pan';<br />
$mpt->env['class']['volume'] = 'vol';<br />
$mpt->env['class']['pitch'] = 'pit';<br />
$mpt->env['class']['other'] = 'oth';<br />
$mpt->env['class']['default'] = 'def';<br />
$mpt->env['class']['divider'] = 'div';<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// MODULE FORMATS<br />
///<br />
<br />
# This is a list of all module formats fully supported by OpenMPT<br />
# The array $env['format_long'] holds the identifier strings, which are<br />
# used when you copy/paste pattern sequences in OpenMPT's pattern editor.<br />
# One of these identifiers always appears in the first line of a<br />
# copied sequence.<br />
$mpt->env['format_long'] = array(<br />
'ModPlug Tracker IT', /* 0 */<br />
'ModPlug Tracker XM', /* 1 */<br />
'ModPlug Tracker MPT', /* 2 */<br />
'ModPlug Tracker S3M', /* 3 */<br />
'ModPlug Tracker MOD'); /* 4 */<br />
<br />
# 'format_short' is used if a user doesn't include the identifier string<br />
# along with the pattern data. In this case one should set one of these<br />
# identifiers using the "format" attribute (i.e. <pattern format="IT">).<br />
$mpt->env['format_short'] = array(<br />
'IT', /* 0 */<br />
'XM', /* 1 */<br />
'MPT', /* 2 */<br />
'S3M', /* 3 */<br />
'MOD'); /* 4 */<br />
<br />
# if no format was determined, highlight patterns as ...<br />
$mpt->env['standardformat'] = 'IT';<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// COMMAND SETS<br />
///<br />
$mpt->env['categories']=array('global','panning','volume','pitch','other');<br />
<br />
# IT Command set<br />
$mpt->env['fx']['IT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['IT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['IT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['IT'][ 'pitch' ] = 'efghouEFGHU';<br />
$mpt->env['fx']['IT'][ 'other' ] = 'IJOQSZ\\#:';<br />
<br />
# MPT Command set<br />
$mpt->env['fx']['MPT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['MPT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['MPT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['MPT'][ 'pitch' ] = 'efghouEFGHU';<br />
$mpt->env['fx']['MPT'][ 'other' ] = 'IJOQSZ\\#:';<br />
<br />
# S3M Command set<br />
$mpt->env['fx']['S3M']['global' ] = 'ABCTVW';<br />
$mpt->env['fx']['S3M']['panning'] = 'pPXY';<br />
$mpt->env['fx']['S3M']['volume' ] = 'vDKLMNR';<br />
$mpt->env['fx']['S3M']['pitch' ] = 'EFGHU';<br />
$mpt->env['fx']['S3M']['other' ] = 'IJOQSZ\\#';<br />
<br />
# XM Command set<br />
$mpt->env['fx']['XM'][ 'global' ] = 'BDFGH';<br />
$mpt->env['fx']['XM'][ 'panning'] = 'lpr8PY';<br />
$mpt->env['fx']['XM'][ 'volume' ] = 'abcdv567AC';<br />
$mpt->env['fx']['XM'][ 'pitch' ] = 'ghu1234';<br />
$mpt->env['fx']['XM'][ 'other' ] = '09EKLRTZ\\#';<br />
<br />
# MOD Command set<br />
$mpt->env['fx']['MOD']['global' ] = 'BDF';<br />
$mpt->env['fx']['MOD']['panning'] = '8';<br />
$mpt->env['fx']['MOD']['volume' ] = '567AC';<br />
$mpt->env['fx']['MOD']['pitch' ] = '1234';<br />
$mpt->env['fx']['MOD']['other' ] = '09E';<br />
<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// STATIC VALUES. NEVER CHANGE THEM!!!<br />
///<br />
$mpt->env['divider'] = '|'; # divider character<br />
$mpt->env['lennote'] = 3;<br />
$mpt->env['leninstr'] = 2;<br />
$mpt->env['lenvol'] = 3;<br />
$mpt->env['lenfx'] = 3;<br />
$mpt->env['bytesperchannel']=12;<br />
<br />
}<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_VST-Plugins&diff=900
Tutorial: VST-Plugins
2009-12-07T15:18:30Z
<p>Cubaxd: /* Routing */</p>
<hr />
<div>Mit VST-Plugins kannst du deine Module mit hochqualitativen Effektprozessoren wie Equalizern oder Kompressor-Effekten ausstatten und virtuelle Instrumente statt Samples benutzen. Diese haben den Vorteil, dass sie häufig kleiner als entsprechende Samples sind und zudem oft nicht so "statisch" klingen. Es gibt eine Unmenge an VST-Plugins, darunter sind auch viele Freeware-Plugins. Die meisten lassen sich in OpenMPT benutzen.<br />
Dieses kleine Tutorial soll die grundlegende Benutzung von VST-Plugins demonstrieren.<br />
<br />
<br />
== Einsteiger-Tipp: Beliebte Plugins ==<br />
Unter den unzähligen VST-Plugins das Richtige zu finden, ist vor allem für Anfänger schwer. Darum habe ich hier eine kleine Liste an kostenlosen Plugins zusammengestellt, die gut klingen und auch für Anfänger geeignet sind.<br />
<br />
=== Effekte ===<br />
* [http://www.kjaerhusaudio.com/classic-series.php Classic Series] - Eine kleine Plugin-Sammlung mit häufig verwendeten Effekten.<br />
* [http://www.aixcoustic.com/index.php/posihfopit_edition/30/0/ Electri-Q (posihfopit edition)] - Ein umfangreicher grafischer Equalizer, der kaum Wünsche offen lässt.<br />
* [http://www.sonicspot.com/freeverb/freeverb.html Freeverb] - Ein brauchbares Reverb-Plugin.<br />
* [http://mda.smartelectronix.com/ MDA] - Eine weitere Plugin-Sammlung mit vielen nützlichen Effekten.<br />
<br />
=== Instrumente ===<br />
* [http://mda.smartelectronix.com/ MDA] - Hier gibt's auch ein paar kleine FM-Softsynths.<br />
* [http://www.ugoaudio.com/ String Theory, Rez, Motion, ...] - Ein paar Synthesizer von Ugo, vor allem String Theory ist sehr interessant.<br />
* [http://www.geocities.jp/daichi1969/softsynth/index.html#down Synth1] - Ein Klassiker unter den FM-Synthesizern: Kompakt, stabil und toller Sound!<br />
<br />
<br />
== VST-Plugins hinzufügen ==<br />
Zunächst musst du die VST-Plugins erst einmal mit OpenMPT "bekannt machen". Am einfachsten geht das, indem du die Plugins (DLL-Dateien) auf das OpenMPT-Fenster ziehst.<br />
Dies kannst du auch mit dem [[Handbuch: Plugin Manager|Plugin-Manager]] erledigen. Diesen benötigst du auch, um die Plugins zu einem Modul hinzuzufügen.<br />
<br />
<br />
== VST-Effekte anwenden ==<br />
[[Bild:general_plugins.png|thumb|right|300px|Hier werden Plugins integriert und ihre Parameter eingestellt]]<br />
VST-Effekte können auf den ganzen Track (Master), auf einzelne Kanäle oder Instrumente angewendet werden. Eine Grundregel, die zunächst erwähnt werden sollte, um Verwirrung zu vermeiden: Pro Kanal ist nur ein Plugin möglich! Wird auf einem Kanal, dem ein eigenes VST-Plugin zugewiesen ist, ein Instrument gespielt, welches selbst mit einem Effekt verbunden ist, wird das Plugin des Kanals ignoriert! Selbiges gilt für Master-Effekte, die in der Plugin-Liste vor anderen Effekten stehen: Diese stehen in Konflikt miteinander und deswegen sollten Master-Plugins in den unteren Teil der Plugin-Liste verfrachtet werden.<br />
<br />
Sobald du einen Effekt in der Plugin-Liste hast, kannst du ihn [[#Plugins editieren|editieren]] und bestimmen, wie der Effekt angewendet werden soll. In den [[Handbuch: General#Mix Settings|Mix Settings]] kannst du z.B. die Option '''Master''' aktivieren, sodass der Effekt auf das ganze Modul angewendet wird. Solche Effekte sollten, wie bereits erwähnt, in der Plugin-Liste möglichst weit unten stehen. Du kannst sie auch nachträglich mit dem Button {{button|Move...}} nach unten verschieben. Ganz nützlich ist auch die '''Bypass'''-Funktion, mit der ein Plugin temporär deaktiviert werden kann.<br />
<br style="clear:right;"/><br />
<br />
[[Bild:general_channels.png|thumb|300px|right|Kanaleigenschaften]]<br />
Um einen Kanal mit einem VST-Effekt zu versehen, genügt es, in den Kanal-Eigenschaften das passende Plugin auszuwählen. Dies geschieht entweder direkt auf dem General-Tab (siehe Bild) oder über den [[Handbuch: Patterns#Plugin-Menü|Pattern-Editor]]. Kanal-Plugins funktionieren nicht mit VST-Instrumenten und die oben genannte Grundregel zur Plugin-Priorität ist zu beachten. Sie sind also nützlich, um einen Kanal, auf dem ein Sample spielt, mit einem Effekt zu versehen oder um Plugins mit [[Handbuch: Macro Configuration|Zxx-Makros]] zu steuern. Diese hängen nämlich vom aktuell aktiven Kanal-Plugin ab.<br />
<br />
Ähnlich leicht lassen sich Effekte mit Instrumenten verknüpfen: Auf dem [[Handbuch: Instrumente#Plugin/MIDI|Instrument-Tab]] im Bereich '''Plugin/MIDI''' wählst du einfach das passende Plugin aus. Die weiteren Dropdown-Menüs in diesem Bereich spielen bei Effekten normalerweise keine Rolle und werden nur bei VST-Instrumenten benötigt.<br />
<br />
== VST-Instrumente anwenden ==<br />
Grundsätzlich verhalten sich VST-Instrumente wie VST-Effekte, jedoch gilt es, einige Unterschiede zu beachten. VST-Instrumente sollten nur Instrumenten zugewiesen werden, also über das Instrument-Tab. Sie sollten '''keinesfalls''' als Master-Plugins oder Kanal-Plugins eingesetzt werden! Die Plugin-Einstellungen dort spielen auch eine Rolle für das Verhalten von den VST-Instrumenten. Es gibt zwei Typen von VST-Instrumenten, zwischen denen man unterscheiden kann:<br />
* '''Monotimbrale VST-Instrumente''' können gleichzeitig nur einen bestimmten Sound ("Patch"), z.B. einen Streichersound, ausgeben. Zwischen verschiedenen Patches kann gewechselt werden, jedoch ist immer nur ein Patch aktiv.<br />
* '''Multitimbrale VST-Instrumente''' können mehrere Patches gleichzeitig verwalten. Dazu müssen diese verschiedenen '''MIDI-Kanälen''' zugewiesen werden. Auf dem Instrument-Tab kann der passende MIDI-Kanal ausgewählt werden, sodass es genügt, eine Instanz für verschiedene Sounds eines multitimbralen VST-Instruments zu laden. So lässt sich z.B. mit einem Mod-Instrument ein Streicher-Patch auf Kanal 1 und mit einem anderen ein Trompeten-Patch auf Kanal 2 ansteuern.<br />
In beiden Fällen kannst du über die Plugin-Einstellungen auf dem Instrument-Tab auswählen, welche Patches auf welchem Kanal gespielt werden sollen.<br />
<br style="clear:right;"/><br />
<br />
<br />
== Plugins editieren ==<br />
[[Bild:Synth1 VSTi.png|thumb|300px|right|Die Oberfläche des ''Synth1''-VSTis]]<br />
Um Plugins zu editieren, kannst du diese entweder direkt über die Plugin-Liste des General-Tabs auswählen und mit {{button|Edit...}} den Editor öffnen, oder die mit Instrumenten verbundenen Plugins durch einen Klick auf den {{button|Editor}}-Button auf dem Instrument-Tab oder den {{button|Plugin}}-Button auf dem General-Tab öffnen. Auch durch einen Klick auf die [[Handbuch: Patterns#Plugin-Menü|Kanal-Header im Pattern-Editor]]. Du siehst schon, es gibt unzählige Wege, schnell zur Plugin-[http://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che GUI] zu gelangen. :-)<br />
<br />
Viele VST-Plugins haben eine eigene GUI, über welche die VST-Parameter direkt bearbeitet werden können. Plugins ohne eigene GUI bekommen in OpenMPT eine Ersatz-GUI spendiert, welche aus einer Liste der editierbaren Parameter besteht. Rechts ist die GUI des Synth1-Plugins abgebildet, welche eine eigene GUI bereitstellt. Dort kannst du an vielen Knöpfen und Drehreglern den Sound des Plugins verändern.<br />
Da diese Optionen von Plugin zu Plugin variieren, werde ich nicht näher darauf eingehen und stattdessen die GUI-Elemente erklären, die bei allen Plugins gleich sind.<br />
<br />
=== Menüs ===<br />
Im oberen Teil des Fenster befindet sich eine Menüzeile.<br />
<br />
Im {{button|File}}-Menü kannst du Plugin-Presets laden und speichern. Dies dient dazu, um Parameter-Einstellungen, die dir gefallen, für den späteren Gebrauch aufzubewahren. Außerdem kannst du die Plugin-Parameter mithilfe von '''Randomize Params''' mit Zufallswerten überschreiben. Bei vielen Plugins kommt dabei aber nur Unsinn raus... :-)<br />
<br />
Über das {{button|Preset}}-Menü gelangst du zu den Presets. Das sind voreingestellte Kombinationen von Plugin-Parametern. Nicht jedes Plugin hat Presets.<br />
<br />
Im {{button|Info}}-Menü findest du in Kurzfassung die [[#Automatisierung|Routing]]-Einstellungen (also von welchem Plugin das gewählte Plugin Sound empfängt und wohin er gesendet wird) und die verfügbaren [[Handbuch: Macro Configuration|Zxx-Makros]], mit denen die Parameter des Plugins automatisiert werden können.<br />
<br />
Im {{button|Options}}-Menü kannst du das Plugin deaktivieren ('''Bypass'''), Änderungen der Plugin-Parameter direkt in die Patterns schreiben lassen ('''Record Params''') oder Tastatureingaben an das Plugin weiterleiten ('''Pass Keys to Plug'''). Dies ist z.B. nötig, wenn du ein Plugin hast, bei dem ein Lizenzschlüssel in die Plugin-GUI eingegeben werden muss, denn standardmäßig werden solche Eingaben von OpenMPT z.B. als Noten interpretiert - Denn du kannst VST-Instrumente auch direkt in diesem Fenster ausprobieren, genau wie im Pattern! Die einzige Voraussetzung dafür ist, dass das Plugin bereits einem Mod-Instrument zugewiesen wurde.<br />
<br />
Mit den Pfeil-Buttons kannst du direkt zwischen den Plugin-Presets wechseln. Die doppelten Pfeile wechseln dabei zehn Slots nach vorne bzw. hinten.<br />
<br />
=== MIDI-Mapping ===<br />
Möchtest du einen Parameter mithilfe von [[Handbuch: MIDI Mapping|MIDI Mapping]] automatisieren, so kannst du die {{key|Shift}}-Taste drücken und gleichzeitig das dazugehörige GUI-Element verändern (also anklicken und die Maus ziehen). Dann öffnet sich der MIDI-Mapping-Dialog automatisch und die Daten des Plugin-Parameters werden automatisch dort eingefügt.<br />
<br />
== Routing ==<br />
Die Ausgabe eines Plugins kann nicht nur zum Master, sondern auch zu einem weiteren Plugin gesendet werden. So lässt sich eine Kette von verschiedenen Effekten realisieren, sodass auch mehr als nur ein Plugin pro Kanal oder Instrument möglich ist. Beispielsweise könnte ein VST-Instrument seine Ausgabe zunächst an einen Equalizer senden, der die Tiefen entfernt und dieser wiederum könnte seine Ausgabe an einen Kompressor weiterleiten.<br />
<br />
Das Routing kannst du in den [[Handbuch: General#Mix Settings|Mix Settings]] konfigurieren. Dazu muss einfach das passende Plugin im '''Output to'''-Dropdown-Menü ausgewählt werden. Du kannst nur Plugins auswählen, die in der Plugin-Liste weiter unten stehen (eine höhere Rangnummer haben); unter Umständen musst du deine Plugins also mit dem {{button|Move...}}-Button verschieben. Spezifizierst du kein Plugin, so wird die Ausgabe einfach an die Master-Plugins oder direkt den Master gesendet (falls es keine Master-Plugins gibt).<br />
<br />
== Automatisierung ==<br />
Plugin-Parameter können in OpenMPT auf verschiedenen Wegen automatisiert werden, also "automatisch" über die Patterns verändert werden. Lange Zeit war dies nur umständlich durch eine Kombination von [[Handbuch: Macro Configuration|Zxx-Makros]] und {{eff|Z}}''xx'' bzw. {{eff|\}}''xx'' gesteuert werden konnten. Dazu muss ein Zxx-Makro erstellt werden, das einen bestimmten Parameter steuert, das Plugin einem Kanal zugewiesen werden und auf dem Kanal das passende Makro mit {{eff|SF}}''x'' aktiviert werden. Diese Methode sollte nicht mehr benutzt werden, da mit [[Param Control-Noten|Parameter Control-Noten]] Plugins viel effizienter angesteuert werden können. Diese belegen zwar ein komplettes Feld im Pattern, dafür sind sie aber auch wesentlich vielseitiger.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_VST-Plugins&diff=899
Tutorial: VST-Plugins
2009-12-07T15:12:21Z
<p>Cubaxd: /* Plugins editieren */</p>
<hr />
<div>Mit VST-Plugins kannst du deine Module mit hochqualitativen Effektprozessoren wie Equalizern oder Kompressor-Effekten ausstatten und virtuelle Instrumente statt Samples benutzen. Diese haben den Vorteil, dass sie häufig kleiner als entsprechende Samples sind und zudem oft nicht so "statisch" klingen. Es gibt eine Unmenge an VST-Plugins, darunter sind auch viele Freeware-Plugins. Die meisten lassen sich in OpenMPT benutzen.<br />
Dieses kleine Tutorial soll die grundlegende Benutzung von VST-Plugins demonstrieren.<br />
<br />
<br />
== Einsteiger-Tipp: Beliebte Plugins ==<br />
Unter den unzähligen VST-Plugins das Richtige zu finden, ist vor allem für Anfänger schwer. Darum habe ich hier eine kleine Liste an kostenlosen Plugins zusammengestellt, die gut klingen und auch für Anfänger geeignet sind.<br />
<br />
=== Effekte ===<br />
* [http://www.kjaerhusaudio.com/classic-series.php Classic Series] - Eine kleine Plugin-Sammlung mit häufig verwendeten Effekten.<br />
* [http://www.aixcoustic.com/index.php/posihfopit_edition/30/0/ Electri-Q (posihfopit edition)] - Ein umfangreicher grafischer Equalizer, der kaum Wünsche offen lässt.<br />
* [http://www.sonicspot.com/freeverb/freeverb.html Freeverb] - Ein brauchbares Reverb-Plugin.<br />
* [http://mda.smartelectronix.com/ MDA] - Eine weitere Plugin-Sammlung mit vielen nützlichen Effekten.<br />
<br />
=== Instrumente ===<br />
* [http://mda.smartelectronix.com/ MDA] - Hier gibt's auch ein paar kleine FM-Softsynths.<br />
* [http://www.ugoaudio.com/ String Theory, Rez, Motion, ...] - Ein paar Synthesizer von Ugo, vor allem String Theory ist sehr interessant.<br />
* [http://www.geocities.jp/daichi1969/softsynth/index.html#down Synth1] - Ein Klassiker unter den FM-Synthesizern: Kompakt, stabil und toller Sound!<br />
<br />
<br />
== VST-Plugins hinzufügen ==<br />
Zunächst musst du die VST-Plugins erst einmal mit OpenMPT "bekannt machen". Am einfachsten geht das, indem du die Plugins (DLL-Dateien) auf das OpenMPT-Fenster ziehst.<br />
Dies kannst du auch mit dem [[Handbuch: Plugin Manager|Plugin-Manager]] erledigen. Diesen benötigst du auch, um die Plugins zu einem Modul hinzuzufügen.<br />
<br />
<br />
== VST-Effekte anwenden ==<br />
[[Bild:general_plugins.png|thumb|right|300px|Hier werden Plugins integriert und ihre Parameter eingestellt]]<br />
VST-Effekte können auf den ganzen Track (Master), auf einzelne Kanäle oder Instrumente angewendet werden. Eine Grundregel, die zunächst erwähnt werden sollte, um Verwirrung zu vermeiden: Pro Kanal ist nur ein Plugin möglich! Wird auf einem Kanal, dem ein eigenes VST-Plugin zugewiesen ist, ein Instrument gespielt, welches selbst mit einem Effekt verbunden ist, wird das Plugin des Kanals ignoriert! Selbiges gilt für Master-Effekte, die in der Plugin-Liste vor anderen Effekten stehen: Diese stehen in Konflikt miteinander und deswegen sollten Master-Plugins in den unteren Teil der Plugin-Liste verfrachtet werden.<br />
<br />
Sobald du einen Effekt in der Plugin-Liste hast, kannst du ihn [[#Plugins editieren|editieren]] und bestimmen, wie der Effekt angewendet werden soll. In den [[Handbuch: General#Mix Settings|Mix Settings]] kannst du z.B. die Option '''Master''' aktivieren, sodass der Effekt auf das ganze Modul angewendet wird. Solche Effekte sollten, wie bereits erwähnt, in der Plugin-Liste möglichst weit unten stehen. Du kannst sie auch nachträglich mit dem Button {{button|Move...}} nach unten verschieben. Ganz nützlich ist auch die '''Bypass'''-Funktion, mit der ein Plugin temporär deaktiviert werden kann.<br />
<br style="clear:right;"/><br />
<br />
[[Bild:general_channels.png|thumb|300px|right|Kanaleigenschaften]]<br />
Um einen Kanal mit einem VST-Effekt zu versehen, genügt es, in den Kanal-Eigenschaften das passende Plugin auszuwählen. Dies geschieht entweder direkt auf dem General-Tab (siehe Bild) oder über den [[Handbuch: Patterns#Plugin-Menü|Pattern-Editor]]. Kanal-Plugins funktionieren nicht mit VST-Instrumenten und die oben genannte Grundregel zur Plugin-Priorität ist zu beachten. Sie sind also nützlich, um einen Kanal, auf dem ein Sample spielt, mit einem Effekt zu versehen oder um Plugins mit [[Handbuch: Macro Configuration|Zxx-Makros]] zu steuern. Diese hängen nämlich vom aktuell aktiven Kanal-Plugin ab.<br />
<br />
Ähnlich leicht lassen sich Effekte mit Instrumenten verknüpfen: Auf dem [[Handbuch: Instrumente#Plugin/MIDI|Instrument-Tab]] im Bereich '''Plugin/MIDI''' wählst du einfach das passende Plugin aus. Die weiteren Dropdown-Menüs in diesem Bereich spielen bei Effekten normalerweise keine Rolle und werden nur bei VST-Instrumenten benötigt.<br />
<br />
== VST-Instrumente anwenden ==<br />
Grundsätzlich verhalten sich VST-Instrumente wie VST-Effekte, jedoch gilt es, einige Unterschiede zu beachten. VST-Instrumente sollten nur Instrumenten zugewiesen werden, also über das Instrument-Tab. Sie sollten '''keinesfalls''' als Master-Plugins oder Kanal-Plugins eingesetzt werden! Die Plugin-Einstellungen dort spielen auch eine Rolle für das Verhalten von den VST-Instrumenten. Es gibt zwei Typen von VST-Instrumenten, zwischen denen man unterscheiden kann:<br />
* '''Monotimbrale VST-Instrumente''' können gleichzeitig nur einen bestimmten Sound ("Patch"), z.B. einen Streichersound, ausgeben. Zwischen verschiedenen Patches kann gewechselt werden, jedoch ist immer nur ein Patch aktiv.<br />
* '''Multitimbrale VST-Instrumente''' können mehrere Patches gleichzeitig verwalten. Dazu müssen diese verschiedenen '''MIDI-Kanälen''' zugewiesen werden. Auf dem Instrument-Tab kann der passende MIDI-Kanal ausgewählt werden, sodass es genügt, eine Instanz für verschiedene Sounds eines multitimbralen VST-Instruments zu laden. So lässt sich z.B. mit einem Mod-Instrument ein Streicher-Patch auf Kanal 1 und mit einem anderen ein Trompeten-Patch auf Kanal 2 ansteuern.<br />
In beiden Fällen kannst du über die Plugin-Einstellungen auf dem Instrument-Tab auswählen, welche Patches auf welchem Kanal gespielt werden sollen.<br />
<br style="clear:right;"/><br />
<br />
<br />
== Plugins editieren ==<br />
[[Bild:Synth1 VSTi.png|thumb|300px|right|Die Oberfläche des ''Synth1''-VSTis]]<br />
Um Plugins zu editieren, kannst du diese entweder direkt über die Plugin-Liste des General-Tabs auswählen und mit {{button|Edit...}} den Editor öffnen, oder die mit Instrumenten verbundenen Plugins durch einen Klick auf den {{button|Editor}}-Button auf dem Instrument-Tab oder den {{button|Plugin}}-Button auf dem General-Tab öffnen. Auch durch einen Klick auf die [[Handbuch: Patterns#Plugin-Menü|Kanal-Header im Pattern-Editor]]. Du siehst schon, es gibt unzählige Wege, schnell zur Plugin-[http://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che GUI] zu gelangen. :-)<br />
<br />
Viele VST-Plugins haben eine eigene GUI, über welche die VST-Parameter direkt bearbeitet werden können. Plugins ohne eigene GUI bekommen in OpenMPT eine Ersatz-GUI spendiert, welche aus einer Liste der editierbaren Parameter besteht. Rechts ist die GUI des Synth1-Plugins abgebildet, welche eine eigene GUI bereitstellt. Dort kannst du an vielen Knöpfen und Drehreglern den Sound des Plugins verändern.<br />
Da diese Optionen von Plugin zu Plugin variieren, werde ich nicht näher darauf eingehen und stattdessen die GUI-Elemente erklären, die bei allen Plugins gleich sind.<br />
<br />
=== Menüs ===<br />
Im oberen Teil des Fenster befindet sich eine Menüzeile.<br />
<br />
Im {{button|File}}-Menü kannst du Plugin-Presets laden und speichern. Dies dient dazu, um Parameter-Einstellungen, die dir gefallen, für den späteren Gebrauch aufzubewahren. Außerdem kannst du die Plugin-Parameter mithilfe von '''Randomize Params''' mit Zufallswerten überschreiben. Bei vielen Plugins kommt dabei aber nur Unsinn raus... :-)<br />
<br />
Über das {{button|Preset}}-Menü gelangst du zu den Presets. Das sind voreingestellte Kombinationen von Plugin-Parametern. Nicht jedes Plugin hat Presets.<br />
<br />
Im {{button|Info}}-Menü findest du in Kurzfassung die [[#Automatisierung|Routing]]-Einstellungen (also von welchem Plugin das gewählte Plugin Sound empfängt und wohin er gesendet wird) und die verfügbaren [[Handbuch: Macro Configuration|Zxx-Makros]], mit denen die Parameter des Plugins automatisiert werden können.<br />
<br />
Im {{button|Options}}-Menü kannst du das Plugin deaktivieren ('''Bypass'''), Änderungen der Plugin-Parameter direkt in die Patterns schreiben lassen ('''Record Params''') oder Tastatureingaben an das Plugin weiterleiten ('''Pass Keys to Plug'''). Dies ist z.B. nötig, wenn du ein Plugin hast, bei dem ein Lizenzschlüssel in die Plugin-GUI eingegeben werden muss, denn standardmäßig werden solche Eingaben von OpenMPT z.B. als Noten interpretiert - Denn du kannst VST-Instrumente auch direkt in diesem Fenster ausprobieren, genau wie im Pattern! Die einzige Voraussetzung dafür ist, dass das Plugin bereits einem Mod-Instrument zugewiesen wurde.<br />
<br />
Mit den Pfeil-Buttons kannst du direkt zwischen den Plugin-Presets wechseln. Die doppelten Pfeile wechseln dabei zehn Slots nach vorne bzw. hinten.<br />
<br />
=== MIDI-Mapping ===<br />
Möchtest du einen Parameter mithilfe von [[Handbuch: MIDI Mapping|MIDI Mapping]] automatisieren, so kannst du die {{key|Shift}}-Taste drücken und gleichzeitig das dazugehörige GUI-Element verändern (also anklicken und die Maus ziehen). Dann öffnet sich der MIDI-Mapping-Dialog automatisch und die Daten des Plugin-Parameters werden automatisch dort eingefügt.<br />
<br />
== Routing ==<br />
Die Ausgbe eines Plugins kann nicht nur zum Master gesendet werden, sondern auch zu einem weiteren Plugin gesendet werden. So lässt sich eine Kette von verschiedenen Effekten realisieren, sodass auch mehr als nur ein Plugin pro Kanal oder Instrument möglich ist. Beispielsweise könnte ein VST-Instrument seine Ausgabe zunächst an einen Equalizer senden, der die Tiefen entfernt und dieser wiederum könnte seine Ausgabe an einen Kompressor weiterleiten.<br />
<br />
Das Routing kannst du in den [[Handbuch: General#Mix Settings|Mix Settings]] konfigurieren. Dazu muss einfach das passende Plugin im '''Output to'''-Dropdown-Menü ausgewählt werden. Du kannst nur Plugins auswählen, die in der Plugin-Liste weiter unten stehen, unter Umständen musst du deine Plugins also mit dem {{button|Move...}}-Button verschieben. Spezifierst du kein Plugin, so wird die Ausgabe einfach an die Master-Plugins oder direkt den Master gesendet (falls es keine Master-Plugins gibt).<br />
<br />
<br />
== Automatisierung ==<br />
Plugin-Parameter können in OpenMPT auf verschiedenen Wegen automatisiert werden, also "automatisch" über die Patterns verändert werden. Lange Zeit war dies nur umständlich durch eine Kombination von [[Handbuch: Macro Configuration|Zxx-Makros]] und {{eff|Z}}''xx'' bzw. {{eff|\}}''xx'' gesteuert werden konnten. Dazu muss ein Zxx-Makro erstellt werden, das einen bestimmten Parameter steuert, das Plugin einem Kanal zugewiesen werden und auf dem Kanal das passende Makro mit {{eff|SF}}''x'' aktiviert werden. Diese Methode sollte nicht mehr benutzt werden, da mit [[Param Control-Noten|Parameter Control-Noten]] Plugins viel effizienter angesteuert werden können. Diese belegen zwar ein komplettes Feld im Pattern, dafür sind sie aber auch wesentlich vielseitiger.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_VST-Plugins&diff=898
Tutorial: VST-Plugins
2009-12-07T15:04:12Z
<p>Cubaxd: /* VST-Effekte anwenden */</p>
<hr />
<div>Mit VST-Plugins kannst du deine Module mit hochqualitativen Effektprozessoren wie Equalizern oder Kompressor-Effekten ausstatten und virtuelle Instrumente statt Samples benutzen. Diese haben den Vorteil, dass sie häufig kleiner als entsprechende Samples sind und zudem oft nicht so "statisch" klingen. Es gibt eine Unmenge an VST-Plugins, darunter sind auch viele Freeware-Plugins. Die meisten lassen sich in OpenMPT benutzen.<br />
Dieses kleine Tutorial soll die grundlegende Benutzung von VST-Plugins demonstrieren.<br />
<br />
<br />
== Einsteiger-Tipp: Beliebte Plugins ==<br />
Unter den unzähligen VST-Plugins das Richtige zu finden, ist vor allem für Anfänger schwer. Darum habe ich hier eine kleine Liste an kostenlosen Plugins zusammengestellt, die gut klingen und auch für Anfänger geeignet sind.<br />
<br />
=== Effekte ===<br />
* [http://www.kjaerhusaudio.com/classic-series.php Classic Series] - Eine kleine Plugin-Sammlung mit häufig verwendeten Effekten.<br />
* [http://www.aixcoustic.com/index.php/posihfopit_edition/30/0/ Electri-Q (posihfopit edition)] - Ein umfangreicher grafischer Equalizer, der kaum Wünsche offen lässt.<br />
* [http://www.sonicspot.com/freeverb/freeverb.html Freeverb] - Ein brauchbares Reverb-Plugin.<br />
* [http://mda.smartelectronix.com/ MDA] - Eine weitere Plugin-Sammlung mit vielen nützlichen Effekten.<br />
<br />
=== Instrumente ===<br />
* [http://mda.smartelectronix.com/ MDA] - Hier gibt's auch ein paar kleine FM-Softsynths.<br />
* [http://www.ugoaudio.com/ String Theory, Rez, Motion, ...] - Ein paar Synthesizer von Ugo, vor allem String Theory ist sehr interessant.<br />
* [http://www.geocities.jp/daichi1969/softsynth/index.html#down Synth1] - Ein Klassiker unter den FM-Synthesizern: Kompakt, stabil und toller Sound!<br />
<br />
<br />
== VST-Plugins hinzufügen ==<br />
Zunächst musst du die VST-Plugins erst einmal mit OpenMPT "bekannt machen". Am einfachsten geht das, indem du die Plugins (DLL-Dateien) auf das OpenMPT-Fenster ziehst.<br />
Dies kannst du auch mit dem [[Handbuch: Plugin Manager|Plugin-Manager]] erledigen. Diesen benötigst du auch, um die Plugins zu einem Modul hinzuzufügen.<br />
<br />
<br />
== VST-Effekte anwenden ==<br />
[[Bild:general_plugins.png|thumb|right|300px|Hier werden Plugins integriert und ihre Parameter eingestellt]]<br />
VST-Effekte können auf den ganzen Track (Master), auf einzelne Kanäle oder Instrumente angewendet werden. Eine Grundregel, die zunächst erwähnt werden sollte, um Verwirrung zu vermeiden: Pro Kanal ist nur ein Plugin möglich! Wird auf einem Kanal, dem ein eigenes VST-Plugin zugewiesen ist, ein Instrument gespielt, welches selbst mit einem Effekt verbunden ist, wird das Plugin des Kanals ignoriert! Selbiges gilt für Master-Effekte, die in der Plugin-Liste vor anderen Effekten stehen: Diese stehen in Konflikt miteinander und deswegen sollten Master-Plugins in den unteren Teil der Plugin-Liste verfrachtet werden.<br />
<br />
Sobald du einen Effekt in der Plugin-Liste hast, kannst du ihn [[#Plugins editieren|editieren]] und bestimmen, wie der Effekt angewendet werden soll. In den [[Handbuch: General#Mix Settings|Mix Settings]] kannst du z.B. die Option '''Master''' aktivieren, sodass der Effekt auf das ganze Modul angewendet wird. Solche Effekte sollten, wie bereits erwähnt, in der Plugin-Liste möglichst weit unten stehen. Du kannst sie auch nachträglich mit dem Button {{button|Move...}} nach unten verschieben. Ganz nützlich ist auch die '''Bypass'''-Funktion, mit der ein Plugin temporär deaktiviert werden kann.<br />
<br style="clear:right;"/><br />
<br />
[[Bild:general_channels.png|thumb|300px|right|Kanaleigenschaften]]<br />
Um einen Kanal mit einem VST-Effekt zu versehen, genügt es, in den Kanal-Eigenschaften das passende Plugin auszuwählen. Dies geschieht entweder direkt auf dem General-Tab (siehe Bild) oder über den [[Handbuch: Patterns#Plugin-Menü|Pattern-Editor]]. Kanal-Plugins funktionieren nicht mit VST-Instrumenten und die oben genannte Grundregel zur Plugin-Priorität ist zu beachten. Sie sind also nützlich, um einen Kanal, auf dem ein Sample spielt, mit einem Effekt zu versehen oder um Plugins mit [[Handbuch: Macro Configuration|Zxx-Makros]] zu steuern. Diese hängen nämlich vom aktuell aktiven Kanal-Plugin ab.<br />
<br />
Ähnlich leicht lassen sich Effekte mit Instrumenten verknüpfen: Auf dem [[Handbuch: Instrumente#Plugin/MIDI|Instrument-Tab]] im Bereich '''Plugin/MIDI''' wählst du einfach das passende Plugin aus. Die weiteren Dropdown-Menüs in diesem Bereich spielen bei Effekten normalerweise keine Rolle und werden nur bei VST-Instrumenten benötigt.<br />
<br />
== VST-Instrumente anwenden ==<br />
Grundsätzlich verhalten sich VST-Instrumente wie VST-Effekte, jedoch gilt es, einige Unterschiede zu beachten. VST-Instrumente sollten nur Instrumenten zugewiesen werden, also über das Instrument-Tab. Sie sollten '''keinesfalls''' als Master-Plugins oder Kanal-Plugins eingesetzt werden! Die Plugin-Einstellungen dort spielen auch eine Rolle für das Verhalten von den VST-Instrumenten. Es gibt zwei Typen von VST-Instrumenten, zwischen denen man unterscheiden kann:<br />
* '''Monotimbrale VST-Instrumente''' können gleichzeitig nur einen bestimmten Sound ("Patch"), z.B. einen Streichersound, ausgeben. Zwischen verschiedenen Patches kann gewechselt werden, jedoch ist immer nur ein Patch aktiv.<br />
* '''Multitimbrale VST-Instrumente''' können mehrere Patches gleichzeitig verwalten. Dazu müssen diese verschiedenen '''MIDI-Kanälen''' zugewiesen werden. Auf dem Instrument-Tab kann der passende MIDI-Kanal ausgewählt werden, sodass es genügt, eine Instanz für verschiedene Sounds eines multitimbralen VST-Instruments zu laden. So lässt sich z.B. mit einem Mod-Instrument ein Streicher-Patch auf Kanal 1 und mit einem anderen ein Trompeten-Patch auf Kanal 2 ansteuern.<br />
In beiden Fällen kannst du über die Plugin-Einstellungen auf dem Instrument-Tab auswählen, welche Patches auf welchem Kanal gespielt werden sollen.<br />
<br style="clear:right;"/><br />
<br />
<br />
== Plugins editieren ==<br />
[[Bild:Synth1 VSTi.png|thumb|300px|right|Die Oberfläche des ''Synth1''-VSTis]]<br />
Um Plugins zu editieren, kannst du diese entweder direkt über die Plugin-Liste Des General-Tabs auswählen und mit {{button|Edit...}} den Editor öffnen, oder die mit Instrumenten verbundenen Plugins durch einen Klick auf den {{button|Editor}}-Button auf dem Instrument-Tab oder den {{button|Plugin}}-Button auf dem General-Tab öffnen. Auch durch einen Klick auf die [[Handbuch: Patterns#Plugin-Menü|Kanal-Header im Pattern-Editor]]. Du siehst schon, es gibt unzählige Wege, schnell zur Plugin-[http://de.wikipedia.org/wiki/Grafische_Benutzeroberfl%C3%A4che GUI] zu gelangen. :-)<br />
<br />
Viele VST-Plugins haben eine eigene GUI, über welche die VST-Parameter direkt bearbeitet werden können. Plugins ohne eigene GUI bekommen in OpenMPT eine Ersatz-GUI spendiert, welche aus einer Liste der editierbaren Parameter besteht. Rechts ist die GUI des Synth1-Plugins abgebildet, welche eine eigene GUI bereitstellt. Dort kannst du an vielen Knöpfen und Drehreglern den Sound des Plugins verändern.<br />
Da diese Optionen von Plugin zu Plugin variieren, werde ich nicht näher darauf eingehen und stattdessen die GUI-Elemente erklären, die bei allen Plugins gleich sind.<br />
<br />
=== Menüs ===<br />
Im oberen Teil des Fenster befindet sich eine Menüzeile.<br />
<br />
Im {{button|File}}-Menü kannst du Plugin-Presets laden und speichern. Dies dient dazu, um Parameter-Einstellungen, die dir gefallen, für den späteren Gebrauch aufzubewahren. Außerdem kannst du die Plugin-Parameter mithilfe von '''Randomize Params''' mit Zufallswerten überschreiben. Bei vielen Plugins kommt dabei aber nur Unsinn raus... :-)<br />
<br />
Über das {{button|Preset}}-Menü gelangst du zu den Presets. Das sind voreingestellte Kombinationen von Plugin-Parametern. Nicht jedes Plugin hat Presets.<br />
<br />
Im {{button|Info}}-Menü findest du in Kurzfassung die [[#Automatisierung|Routing]]-Einstellungen (also von welchem Plugin das gewählte Plugin Sound empfängt und wohin er gesendet wird) und die verfügbaren [[Handbuch: Macro Configuration|Zxx-Makros]], mit denen die Parameter das Plugin automatisiert werden kann.<br />
<br />
Im {{button|Options}}-Menü kannst du das Plugin deaktivieren ('''Bypass'''), änderungen der Plugin-Parameter direkt in die Patterns schreiben lassen ('''Record Params''') oder Tastatureingaben an das Plugin weiterleiten ('''Pass Keys to Plug'''). Dies ist z.B. nötig, wenn du ein Plugin hast, bei dem ein Lizenzschlüssel in die Plugin-GUI eingegeben werden muss, denn standardmäßig werden solche Eingaben von OpenMPT z.B. als Noten interpretiert - Denn du kannst VST-Instrumente auch direkt in diesem Fenster ausprobieren, genau wie im Pattern! Die einzige Voraussetzung dafür ist, dass das Plugin bereits einem Mod-Instrument zugewiesen wurde.<br />
<br />
Mit den Pfeil-Buttons kannst du direkt zwischen den Plugin-Presets wechseln. Die doppelten Pfeile wechseln dabei zehn Slots nach vorne bzw. hinten.<br />
<br />
=== MIDI-Mapping ===<br />
Möchtest du einen Parameter mithilfe von [[Handbuch: MIDI Mapping|MIDI Mapping]] automatisieren, so kannst du die {{key|Shift}}-Taste drücken und gleichzeitig das dazugehörige GUI-Element verändern (also anklicken und die Maus ziehen). Dann öffnet sich der MIDI-Mapping-Dialog automatisch und die Daten des Plugin-Parameters werden automatisch dort eingefügt.<br />
<br />
<br />
== Routing ==<br />
Die Ausgbe eines Plugins kann nicht nur zum Master gesendet werden, sondern auch zu einem weiteren Plugin gesendet werden. So lässt sich eine Kette von verschiedenen Effekten realisieren, sodass auch mehr als nur ein Plugin pro Kanal oder Instrument möglich ist. Beispielsweise könnte ein VST-Instrument seine Ausgabe zunächst an einen Equalizer senden, der die Tiefen entfernt und dieser wiederum könnte seine Ausgabe an einen Kompressor weiterleiten.<br />
<br />
Das Routing kannst du in den [[Handbuch: General#Mix Settings|Mix Settings]] konfigurieren. Dazu muss einfach das passende Plugin im '''Output to'''-Dropdown-Menü ausgewählt werden. Du kannst nur Plugins auswählen, die in der Plugin-Liste weiter unten stehen, unter Umständen musst du deine Plugins also mit dem {{button|Move...}}-Button verschieben. Spezifierst du kein Plugin, so wird die Ausgabe einfach an die Master-Plugins oder direkt den Master gesendet (falls es keine Master-Plugins gibt).<br />
<br />
<br />
== Automatisierung ==<br />
Plugin-Parameter können in OpenMPT auf verschiedenen Wegen automatisiert werden, also "automatisch" über die Patterns verändert werden. Lange Zeit war dies nur umständlich durch eine Kombination von [[Handbuch: Macro Configuration|Zxx-Makros]] und {{eff|Z}}''xx'' bzw. {{eff|\}}''xx'' gesteuert werden konnten. Dazu muss ein Zxx-Makro erstellt werden, das einen bestimmten Parameter steuert, das Plugin einem Kanal zugewiesen werden und auf dem Kanal das passende Makro mit {{eff|SF}}''x'' aktiviert werden. Diese Methode sollte nicht mehr benutzt werden, da mit [[Param Control-Noten|Parameter Control-Noten]] Plugins viel effizienter angesteuert werden können. Diese belegen zwar ein komplettes Feld im Pattern, dafür sind sie aber auch wesentlich vielseitiger.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Handbuch:_Patterns&diff=868
Handbuch: Patterns
2009-09-27T13:54:29Z
<p>Cubaxd: /* Patternsequenz */</p>
<hr />
<div>{{Handbuch TOC}}<br />
<br />
[[Bild:tab_patterns.png|center]]<br />
Im Pattern-Editor wird das eigentliche Modul erstellt. Doch bevor man dies tut, sollte man mit dem [[Handbuch:_Samples|Sample-Editor]] mindestens ein Sample reinladen, damit dieses dann im Pattern-Editor genutzt werden kann.<br />
<br />
===Werkzeugleiste===<br />
[[Bild:patterns_toolbar.png]]<br />
{|cellspacing="0" width="100%"<br />
|style="background-color:#cef;border-top:1px solid black;width:5%;"|'''#'''<br />
|style="background-color:#cef;border-top:1px solid black"|'''Beschreibung'''<br />
|style="background-color:#cef;border-top:1px solid black"|'''Tastenkürzel'''<br />
|-<br />
|1<br />
|Hier lässt sich ein neues Pattern erstellen<br />
|<br />
|-<br />
|style="background-color:#eee;"|2<br />
|style="background-color:#eee;"|Das aktuelle Pattern wird ab der Cursorposition abgespielt<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|F7}}<br />
|-<br />
|3<br />
|Das aktuelle Pattern wird vom Anfang abgespielt<br />
|{{Key|F7}}<br />
|-<br />
|style="background-color:#eee;"|4<br />
|style="background-color:#eee;"|Die Audio-Ausgabe wird gestoppt<br />
|style="background-color:#eee;"|{{Key|F8}}<br />
|-<br />
|5<br />
|Die aktuelle Zeile wird abgespielt<br />
|{{Key|Ctrl}}+{{Key|Return}}<br />
|-<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|6<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|Ist der Button eingeschaltet, können Patterns bearbeitet werden<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|{{Key|Strg}}+{{Key|Leertaste}}<br />
|-<br />
|7<br />
|Hier lassen sich die VU-Meter für jeden Kanal anzeigen oder ausblenden<br />
|<br />
|-<br />
|style="background-color:#eee;"|8<br />
|style="background-color:#eee;"|Hier lässt sich die Plugin-Leiste für jeden Kanal anzeigen oder ausblenden<br />
|style="background-color:#eee;"|<br />
|-<br />
|9<br />
|Öffnet den [[Handbuch:_Channel_Manager|Kanal-Manager]]<br />
|<br />
|-<br />
|style="background-color:#eee;border-top:1px solid #889;"|10<br />
|style="background-color:#eee;border-top:1px solid #889;"|Öffnet den [[Handbuch: Macro Configuration|Zxx-Makro-Konfigurationsdialog]]<br />
|style="background-color:#eee;border-top:1px solid #889;"|<br />
|-<br />
|11<br />
|Öffnet den [[Handbuch: Chord Editor|Akkord-Editor]]<br />
|<br />
|-<br />
|style="background-color:#eee;border-top:1px solid #889;"|12<br />
|style="background-color:#eee;border-top:1px solid #889;"|Hier lassen sich die letzten Änderungen rückgängig machen<br />
|style="background-color:#eee;border-top:1px solid #889;"|<br />
|-<br />
|13<br />
|Öffnet einen Dialog, in dem sich die Länge des Patterns einstellen lässt<br />
|-<br />
|style="background-color:#eee;"|14<br />
|style="background-color:#eee;"|Vergrößert das aktuelle Pattern auf seine doppelte Länge<br />
|style="background-color:#eee;"|<br />
|-<br />
|15<br />
|Halbiert das aktuelle Pattern in seiner Länge, d. h. jede zweite Zeile wird gelöscht<br />
|-<br />
|style="background-color:#eee;border-top:1px solid #889;"|16<br />
|style="background-color:#eee;border-top:1px solid #889;"|Blendet alle Lautstärke- und Effektreihen aus<br />
|style="background-color:#eee;border-top:1px solid #889;"|<br />
|-<br />
|17<br />
|Blendet alle Effektreihen aus<br />
|-<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|18<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|Volle Darstellung<br />
|style="background-color:#eee;border-bottom:1px solid #889;"|<br />
|-<br />
|style="background-color:#eee;border-bottom:1px solid black;"|19<br />
|style="background-color:#eee;border-bottom:1px solid black;"|Aktiviert oder deaktiviert Overflow Paste - Falls ein Patternteil einfügt wird, der über das Ende des Patterns hinausgeht, wird das Einfügen im nächsten Pattern forgesetzt. Nützlich für Echos.<br />
|style="background-color:#eee;border-bottom:1px solid black;"|<br />
|}<br />
<br />
=== Bedienung ===<br />
[[Bild:patterns_control.png]]<br />
<br />
Im Eingabefeld '''Pattern name''' kann dem jeweils aktuellen Pattern ein Name gegeben werden.<br />
<br />
'''Row Spacing''': Wird im Pattern-Editor eine Note hinzugefügt, wird automatisch <code>X</code> Stellen nach unten gesprungen, wobei <code>X</code> ein Wert zwischen 0 und 16 ist. Der Standard ist 0, das heißt, der Cursor bleibt nach Hinzufügen einer Note an der selben Stelle.<br />
<br />
'''Loop Pattern''' wird automatisch mit einem Häkchen versehen, sobald man das aktuelle Pattern abspielt (etwa durch drücken von {{Key|F7}}). Entfernt man während der Wiedergabe das Häkchen, wird ab diesem Moment in den Modus übergegangen, in dem das gesamte Modul abgespielt wird. Anders rum verhält es sich genauso: Wird beispielsweise durch {{Key|F5}} das Modul abgespielt, geht das Programm nach dem aktivieren des Häkchens in den Pattern-Play-Modus über und spielt von nun an nur das gerade gespielte Pattern.<br />
<br />
Wenn bei '''Follow Song''' ein Häkchen gesetzt ist, ist der Cursor beim Abspielen des Moduls immer zentriert, wobei er sich immer auf der Zeile im Modul befindet, die gerade abgespielt wird. Man kann also das Lied verfolgen.<br />
<br />
Im Auswahlfeld '''Main Instrument''' kann man das Instrument aussuchen, welches man momentan im Pattern-Editor benutzen möchte. Dieses muss selbstverständlich vorher im [[Handbuch:_Samples|Sample-Editor]] bzw. [[Handbuch:_Instrumente|Instrument-Editor]] existieren. Eine andere Möglichkeit, zwischen den Instrumenten hin und her zu schalten, besteht in der Tastenkombination {{Key|Strg}}+{{Key|↑}} bzw. {{Key|Strg}}+{{Key|↓}}. Wenn im Pattern-Editor eine Note hinzugefügt wird, wird zusätzlich das hier angezeigte Instrument mit angegeben, so dass es nicht extra eingegeben werden muss. Ist dem gewählten Instrument ein VST-Plugin zugewiesen, kann dieses mit einem Klick auf {{button|Plugin}} konfiguriert werden.<br />
<br />
Mit '''Keyboard Split''' kannst du die Tastatur (bzw ein angeschlossenes MIDI-Gerät) in zwei Bereiche aufteilen. Der untere Bereich wird vom bereits genannten "Main Instrument" gespielt. Im Auswahlfeld '''Note''' wird festgelegt, bei welcher Note die Tastatur aufgeteilt wird. Im daneben liegenden Feld stellst du das Instrument ein, das '''unterhalb''' (!) dieser Note verwendet werden soll. Der Button {{button|Plugin}} funktioniert analog zum Button im Main Instrument-Bereich. Mit dem Auswahlfeld '''Volume''' legst du fest, wie laut dieses Instrument gespielt werden soll (vxx- bzw Cxx-Effekt). Mit '''Octave Shift''' kannst du das Instrument nach oben oder nach unten transponieren, so wie du es gerade brauchst. Diese Option tritt allerdings erst in Kraft, wenn du '''Transpose''' rechts daneben aktivierst.<br />
<br />
===Patternsequenz===<br />
<br />
[[Bild:patterns_playlist.png]]<br />
<br />
Die Patternsequenz oder "Order list" ist neben den Patterns selbst ein zentraler Punkt jedes Moduls: Hier trägst du ein, in welcher Reihenfolge und wie oft welche Patterns abgespielt werden sollen. Dabei werden die Patterns üblicherweise von links nach rechts abgespielt, wobei du auch mit Pattern-Effekten zu anderen, schon gespielten Patterns springen kannst.<br />
<br />
==== Patterns erstellen und einfügen ====<br />
<br />
Zu Beginn hat jedes Modul nur einen Pattern mit der Nummer <code>0</code>. Die restlichen Felder sind mit <code>---</code> beschriftet und zeigen das Songende an. Du kannst mit den bereits erwähnten Pattern-Effekten auch zu Patterns hinter dieser Markierung springen, wenn du willst, aber sobald solch ein Pattern beim Abspielen erreicht wird, wird das Modul von vorne abgespielt oder gestoppt (bei deaktiviertem Loop-Modus).<br />
<br />
Bereits existierende Patterns kannst du einfach durch Eintippen der passenden Nummer (z.B. <code>14</code>) in die Sequenz übernehmen. Ein Sequenz-Item kann mit der {{key|Einfg}}-Taste verdoppelt werden - dieser Pattern wird dann zwei Mal abgespielt. Beachte beim Bearbeiten, dass alle Einträge mit der selben Patternnummer in der Sequenz auch davon betroffen sind! Mit der {{key|Entf}}-Taste kannst du einen Pattern aus der Sequenz löschen.<br />
<br />
Um mehr Übersicht zu erhalten, kannst du auch '''Dummy-Patterns''' einfügen (<code>+++</code>). Diese werden nicht abgespielt, schaffen aber einen besseren Überblick über dein Modul. Am einfachsten ist es, an der gewünschten Stelle einen Pattern 0 zu erstellen und dann zweimal die {{Key|-}}-Taste zu drücken. Hast du an der gewünschten Stelle bereits einen ungenutzten Pattern (<code>---</code>), reicht es, einmal diese Taste zu drücken.<br />
<br />
Neue, leere Patterns kannst du über den Kontextmenü-Eintrag '''Create New Pattern''' einfügen. Möchtest du den aktuellen Pattern noch einmal in veränderter Form benutzen, kannst du '''Duplicate Pattern''' aus dem Kontextmenü anwenden. Dieser Befehl stellt eine Kopie des aktuellen Patterns her.<br />
<br />
==== Patterns verschieben ====<br />
<br />
Du kannst einen oder mehrere Patterns mit Drag and Drop verschieben. Markiere dazu den ersten Pattern und, falls du mehrere Patterns verschieben möchtest, mit {{key|Shift}}+Klick den letzten zu verschiebenden Pattern. Dann kannst du diese Auswahl einfach an eine andere Stelle in der Sequenz ziehen. So kannst du besonders einfach z.B. mehere Patterns verdoppeln (über das Kontextmenü) und dann ans Ende des Moduls schieben.<br />
<br />
==== Abspielreihenfolge temporär ändern: Die Queue-Funktion ====<br />
<br />
Nicht nur im Live-Betrieb nützlich ist die '''Queue-Funktion''': Klicke auf einen Pattern in der Reihenfolge und drücke dabei die {{key|Strg}}-Taste. In diesem Fall wird nicht sofort zum Pattern gesprungen, sondern erst, wenn der im Moment gespielte Pattern zu Ende ist. Der nächste Pattern wird in diesem Fall mit einem Unterstrich markiert.<br />
<br />
==== Patterns als Wave-Datei exportieren ====<br />
<br />
Möchtest du schnell einen oder mehrere Patterns in eine Wave-Datei rendern, kannst du dies über den Kontextmenü-Eintrag '''Render to Wave''' tun. Dabei erscheint der normale [[Handbuch:_WAV-Export|WAV-Export-Dialog]] mit bereits richtig eingestelltem Start- und Endpattern.<br />
<br />
====Subsongs====<br />
<br />
Im MPTM-Format ist es möglich, mehrere Sequenzen zu erstellen, um "Subsongs" (also mehere Musikstücke in einer Datei) zu kreieren. Mit einem Rechtsklick auf die aktuelle Sequenz kannst du im Untermenü {{button|Sequences}} neue Sequenzen hinzufügen oder zu diesen wechseln. Du kannst deinen Sequenzen auch im "Sequence Name"-Feld Namen geben.<br />
<br />
===Der Pattern-Editor===<br />
Der eigentliche Patterneditor besteht aus einer Art Tabelle, die als Standard 64 Zeilen (0-63) und 32 Kanäle hat.<br />
[[Bild:patterns_pattern_description.png|right|Der Pattern-Editor]]<br />
Jeder Kanal ist in 4 Spalten unterteilt:<br />
# Note<br />
# Instrument<br />
# Effekt 1, (Volume Column) hauptsächlich für Lautstärke und Panning gedacht<br />
# Effekt 2, (Effect Column)<br />
<br />
Eine Zeile kann also wie folgt aussehen (IT/S3M/MPTM):<br />
<br />
{{seq|C-4|01|v32|M20}}<br />
<br />
{{note|C-4}} ist die Note, die gespielt wird, {{smp|01}} ist die Nummer des Instruments oder Samples, {{vol|v32}} ist Effekt 1 (hier halbe Lautstärke) und {{eff|M20}} ist Effekt 2 (hier Maximallautstärke des Kanals). Die Lautstärke, die in der linken Effektspalte eingetragen wird, ist immer relativ zur Maximallautstärke. Ist also die die maximale Lautstärke {{eff|M20}}, so ist {{vol|v32}} nur die Hälfte von der Hälfte ({{eff|M20}}) der wirklichen Maximallautstärke ({{eff|M40}}).<br />
<br />
Natürlich ist es nicht notwendig, jede gespielte Note mit Effekten zu versehen. So könnte eine Zeile auch schlicht so aussehen:<br />
<br />
{{seq|C-4|01|...|...}}<br />
<br />
Hier wird also Instrument 1, Note C in der 4. Oktave gespielt. Lautstärke und Panning entsprechen dabei den Standardwerten, die dem Kanal zugewiesen wurden (entweder im General-Tab, oder während der Laufzeit durch entsprechende Befehle. Der oben angegebene Befehl {{eff|M20}} beispielsweise setzt die Maximallautstärke des Kanals dauerhaft auf halbe Lautstärke, bis der Befehl erneut im selben Kanal mit einem anderen Wert aufgerufen wird).<br />
<br />
Befindet sich also der Cursor ganz links in einem Kanal (wie in der Abbildung oben, ganz links in Kanal 1, Zeile 0), hat man die Kontrolle über die Note.<br />
<br />
Drei weitere Befehle lassen sich in der linken Spalte anwenden:<br />
<br />
* Note Cut ({{note|^^}} - stoppt das gegenwärtig gespielte Instrument/Sample) - S3M, IT, MPTM<br />
* Note Off ({{note|&#61;&#61;}} - Fadet das gespielte Instrument aus und/oder verlässt die Sustain-Schleife des Samples und / oder des Instruments) - XM, IT, MPTM<br />
* Note Fade ({{note|~~}} - Fadet das gespielte Instrument aus) - IT, MPTM<br />
<br />
{{Hinweis|Die Tastenbelegungen für diese Befehle ...|lassen sich im Setup-Fenster auf dem Reiter [[Handbuch:_Setup/Keyboard|Keyboard]] einstellen (dort, wo die Tastaturbelegung für die Noten eingestellt werden kann)}}<br />
<br />
Geht man jetzt mit der {{Key|Cursortaste}} nach rechts (der Pattern-Editor muss dafür den Fokus haben; zur Not einfach mit der linken Maustaste in den Pattern-Editor klicken), ist man auf dem Feld, wo man die Nummer des Instruments editieren kann. Dies ist aber in der Regel gar nicht nötig, sofern man in der Sektion Main Instrument, oder mit der Tastenkombination {{Key|Strg}}+{{Key|↑}} bzw. {{Key|Strg}}+{{Key|↓}} ein Instrument auswählt, bevor man im linken Feld eine Note eingibt. Das Instrument wird dann mit der Note eingefügt. Existieren keine Instrumente, bezieht sich die Zahl an dieser Stelle auf die Samplenummer.<br />
<br />
Noch einen Schritt weiter nach rechts befindet sich das linke Effektfeld, welches hauptsächlich für Lautstärke und Panning gedacht ist. Sofern vorhanden, kann durch das Drücken der {{Key|Menütaste}} auf der Tastatur (links neben der rechten {{Key|Strg}}-Taste) ein Menü geöffnet werden, wo man alle Werte für eine Zeile in einem Kanal per Maus eingeben kann. Andernfalls kann dieses Menü mit einem Doppelklick mit der linken Maustaste auf die gewünschte Zeile eines Kanals aufgerufen werden. Dieses Fenster teilt sich in Note, Volume (linke Effektreihe) und Effect (rechte Effektreihe). Unter Note lassen sich auch Note Cut und Note Off einfügen.<br />
<br />
Geht man nochmal mit dem Cursor nach rechts, ist man im rechten Effektfeld, in dem sich noch viel mehr Effekte anwenden lassen. Dieses besteht aber eigentlich aus 2 Spalten, wobei in der ersten der Befehl und in der zweiten der Wert eingegeben wird.<br />
<br />
Im Kapitel [[Handbuch:_Effektbefehle|Effektbefehle]] findest du eine Übersicht über die verschiedenen Effektbefehle.<br />
<br />
{{Hinweis|Beim Erlernen der Effektbefehle gilt es zu beachten, ...|dass die verschiedenen Modul-Formate auch verschiedene Befehle benutzen. So sind die Befehle bei MOD/XM-Modulen ganz andere als bei S3M/IT-Modulen. Wenn man sich noch nicht auf ein bestimmtes Modulformat festgelegt hat, ist es sowieso besser, man beginnt gleich mit dem Impulse-Tracker-Format (IT), da dieses das Fortschrittlichste unter den von OpenMPT unterstützten Formaten ist. Wobei aber das neue MPTM-Format in Zukunft noch mehr Funktionalitäten beinhalten sollte, momentan aber noch einen Ableger von IT darstellt.|}}<br />
<br />
===Menüs im Patterneditor===<br />
<br />
====Kanal-Menü====<br />
[[Bild:patterns_channel_title_1.png]]<br />
<br />
Das Kanalmenü lässt sich durch einen Rechtsklick in der hier grün umrahmten Fläche öffnen.<br />
{|cellspacing="0"<br />
|style="border-top:1px solid black;background-color:#cef;width:25%;"|'''Menüpunkt'''<br />
|style="border-top:1px solid black;background-color:#cef;"|'''Beschreibung'''<br />
|-<br />
|Mute Channel<br />
|Mute Channel schaltet den Kanal stumm oder wieder ein. Dies kann auch durch einen Linksklick auf die oben grün markierte Fläche geschehen.<br />
|-<br />
|style="background-color:#eee;"|Solo Channel<br />
|style="background-color:#eee;"|Dieser Menüpunkt schaltet alle anderen Kanäle stumm. Durch den Menüpunkt Unmute all, der an der selben stelle erscheint, falls Solo Channel angewendet wurde, kann dies wieder rückgängig gemacht werden.<br />
|-<br />
|Unmute All<br />
|Der Menüpunkt Unmute all ist nur sichtbar, falls es stummgestellte Kanäle gibt. Hier lassen sich alle zusammen wieder einschalten.<br />
|-<br />
|style="background-color:#eee;"|On Transition: Mute<br />
|style="background-color:#eee;"|Schaltet den Kanal stumm, sobald das aktuell gespielte Pattern zu Ende gespielt ist. Lässt sich auch aktivieren, indem man den Kanalkopf (grün umrahmte Fläche) anklickt und gleichzeitig {{key|Strg}} drückt.<br />
|-<br />
|On Transition: Unmute all<br />
|Durch On Transition: Unmute all werden alle derzeit eventuell stummgeschalteten Kanäle beim Abspielen nach dem Durchlauf des aktuellen Patterns wieder lautgeschaltet.<br />
|-<br />
|style="background-color:#eee;"|On Transition: Solo<br />
|style="background-color:#eee;"|Schaltet beim Abspielen am Ende des Patterns alle Kanäle stumm, außer den, von dem das Menü aufgerufen wurde.<br />
|-<br />
|Reset Channel<br />
|Setzt den Kanal komplett zurück, sodass keine Noten mehr darauf spielen.<br />
|-<br />
|style="background-color:#eee;"|Record select<br />
|style="background-color:#eee;"|Markierst du mit dieser Funktion Kanäle als Aufnahmekanäle, werden die auf der Tastatur oder einem MIDI-Gerät gedrückten Noten passend auf diese Kanäle verteilt. Spielst du eine einfache Melodie oder Akkorde, werden die Noten auf alle gewählten Kanäle gleichmäßig verteilt.<br />
|-<br />
|Split Record select<br />
|Selbiges gilt für diese Funktion - mit dem Unterschied, dass du mit dieser Funktion die Kanäle auswählst, die für das zweite Instrument bereitgestellt werden (sofern der Keyboard Split-Modus aktiviert ist).<br />
|-<br />
|style="background-color:#eee;"|Duplicate Channel<br />
|style="background-color:#eee;"|Der gewählte Kanal wird verdoppelt.<br />
|-<br />
|Add Channel<br />
|fügt einen Kanal in das Modul ein. Man kann sich aussuchen, ob man einen Kanal vor den Kanal von dem das Menü aufgerufen wurde (Before this channel) oder danach (After this channel) einfügen möchte. Dies wirkt sich auf alle Patterns aus.<br />
|-<br />
|style="border-bottom:1px solid black; background-color:#eee;"|Remove channel<br />
|style="border-bottom:1px solid black; background-color:#eee;"|Mit Remove channel lässt sich ein Kanal entfernen. Durch Remove this channel wird der gewählte Kanal entfernt und durch Choose channels to remove ... lässt sich in einer Liste auswählen welche(r) Kanal/Kanäle entfernt werden soll(en). In dieser Liste können bei gedrückter Strg-Taste mehrere Kanäle ausgewählt werden. Dies wirkt sich auf alle Patterns aus!<br />
|}<br />
<br />
====Plugin-Menü====<br />
[[Bild:patterns_channel_title_2.png|left]]<br />
{{Hinweis|Ist dieses Feld nicht zu sehen?|Dieses Menü ist nur sichtbar, wenn in der Werkzeugleiste des Pattern-Editors der entsprechende Button aktiviert wurde; siehe [[Handbuch: Patterns#Werkzeugleiste|Button 8 in dieser Abbildung]].}}<br clear="all" /><br />
Hier öffnet sich nach einem Rechtsklick eine Liste aller ins Modul eingefügter Plugins. So lässt sich ein Plugin für diesen Kanal auswählen. Ist ein Plugin ausgewählt und wird hier angezeigt, lässt sich durch einen Linksklick auf die in der Abbildung grün umrahmte Fläche ein Fenster öffnen, wo die Parameter des Plugins eingestellt werden können.<br />
<br />
Wie sich Plugins integrieren lassen, kann im ''General''-Unterkapitel [[Handbuch: General#Plugins|Plugins]] nachgelesen werden.<br />
<br />
====Pattern-Kontextmenü====<br />
Dieses Menü wird durch einen Rechtsklick in einem Kanal des Pattern-Editors geöffnet.<br />
{{Hinweis|Du siehst weniger Optionen in diesem Menü?|Gezeigt wird hier das "neue" Kontextmenü. Vielleicht hast du noch im Setup das [[Handbuch:_Setup/General#Old_style_pattern_context_menu|Alte Kontextmenü]] aktiviert.}}<br />
<br />
{|cellspacing="0"<br />
|style="border-top:1px solid black;background-color:#cef;width:15%"|'''Menüpunkt'''<br />
|style="border-top:1px solid black;background-color:#cef;"|'''Beschreibung'''<br />
|style="border-top:1px solid black;background-color:#cef;"|'''Tastenkürzel'''<br />
|-<br />
|Select column<br />
|Die Spalte von der dieser Menüpunkt aufgerufen wurde, wird ausgewählt.<br />
|{{Key|Strg}}+{{Key|L}}<br />
|-<br />
|style="background-color:#eee;"|Select pattern<br />
|style="background-color:#eee;"|Das gesamte Pattern wird ausgewählt.<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|5}}<br />
|-<br />
|Cut<br />
|Die Auswahl wird ausgeschnitten und im Clipboard abgelegt.<br />
|{{Key|Strg}}+{{Key|X}}<br />
|-<br />
|style="background-color:#eee;"|Copy<br />
|style="background-color:#eee;"|Die Auswahl wird ins Clipboard kopiert<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|C}}<br />
|-<br />
|Paste<br />
|Ein vorher kopierter oder ausgeschnittener Bereich wird ab Cursorposition eingefügt.<br />
|{{Key|Strg}}+{{Key|V}}<br />
|-<br />
|style="background-color:#eee;"|Mix Paste<br />
|style="background-color:#eee;"|Ein vorher kopierter oder ausgeschnittener Bereich wird an Cursorposition eingefügt, jedoch werden Noten nur an Positionen geschrieben, die vorher noch leer waren. Der Bereich wird also nicht überschrieben. <br />
|style="background-color:#eee;"|<br />
|-<br />
|Undo<br />
|Hier lassen sich die letzten Schritte rückgängig machen.<br />
|{{Key|Strg}}+{{Key|Z}}<br />
|-<br />
|style="background-color:#eee;"|Clear Selection<br />
|style="background-color:#eee;"|Ein ausgewählter Bereich oder das Element unter dem Cursor wird gelöscht.<br />
|style="background-color:#eee;"|{{Key|Entf}}<br />
|-<br />
|Interpolate Effect<br />
|Für diese Option müssen an beiden Enden der Auswahl die selben Befehle mit gleichen oder anderen Werten stehen. Steht beispielsweise am Anfang der Auswahl der Befehl X00 und am anderen Ende XFF, so werden die Zeilen dazwischen (sofern nicht schon mit einem anderen Befehl belegt) mit diesem Befehl und den zwischen 0x00 und 0xFF liegenden Werten gefüllt. Dies würde in diesem konkreten Beispiel einen Panning-Slide (von ganz links nach ganz rechts) ergeben.<br />
|{{Key|Strg}}+{{Key|K}}<br />
|-<br />
|style="background-color:#eee;"|Interpolate Vol Col<br />
|style="background-color:#eee;"|Für diesen Menüpunkt gilt das selbe wie für Interpolate Effect. Hier wird die Funktion jedoch auf die Volume Column (die linke Effektspalte) angewendet. Hier lässt sich beispielsweise ein linearer Fade-In anwenden, falls z. B. am Anfang der Auswahl v00 steht und am Ende v64, werden die Zeilen dazwischen mit den entsprechenden Werten gefüllt.<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|L}}<br />
|-<br />
|Interpolate Note<br />
|Hier muss am Anfang und am Ende der Auswahl jeweils eine Note stehen. Die Zeilen dazwischen werden mit Noten gefüllt, die zwischen diesen beiden Noten liegen.<br />
|<br />
|-<br />
|style="background-color:#eee;"|Transpose +1<br />
|style="background-color:#eee;"|Die Noten im ausgewählten Bereich oder die Note, die sich unter dem Cursor befindet, werden/wird um einen Halbton nach oben versetzt. Also aus C-5 wird z. B. C#5.<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|Q}}<br />
|-<br />
|Transpose -1<br />
|Die Noten im ausgewählten Bereich oder die Note, die sich unter dem Cursor befindet, werden/wird um einen Halbton nach unten versetzt.<br />
|{{Key|Strg}}+{{Key|A}}<br />
|-<br />
|style="background-color:#eee;"|Transpose +12<br />
|style="background-color:#eee;"|Die Noten im ausgewählten Bereich oder die Note, die sich unter dem Cursor befindet, werden/wird um eine Oktave nach oben versetzt<br />
|style="background-color:#eee;"|{{Key|Shift}}+{{Key|Strg}}+{{Key|Q}}<br />
|-<br />
|Transpose -12<br />
|Die Noten im ausgewählten Bereich oder die Note, die sich unter dem Cursor befindet, werden/wird um eine Oktave nach unten versetzt<br />
|{{Key|Shift}}+{{Key|Strg}}+{{Key|A}}<br />
|-<br />
|style="background-color:#eee;"|Change Instrument<br />
|style="background-color:#eee;"|Hier lässt sich für die Cursorposition oder einen ausgewählten Bereich die Instrumentspalte manipulieren. Z. B. kann für alle Zeilen in der Auswahl, in denen eine Note vorkommt, die Instrumentnummer geändert oder ganz gelöscht werden. Mit Strg+I werden alle Instrumente in der Auswahl auf das aktuell eingestellte geändert.<br />
|style="background-color:#eee;"|{{Key|Strg}}+{{Key|I}}<br />
|-<br />
|Amplify<br />
|Mit diesem Befehl kann in einer Auswahl die Lautstärke verstärkt oder verringert werden. Die Lautstärke wird durch den Befehl v in der linken Effektspalte eingestellt. Ist z. B. die Lautstärke in einer Zeile auf v40, ist nach einer Verstärkung auf 120% der Wert auf v48.<br />
|{{Key|Alt}}+{{Key|M}}<br />
|-<br />
|style="background-color:#eee;"|Visualize Effect<br />
|style="background-color:#eee;"|Hier kann für einen vorher ausgewählten Bereich der Parameter-Editor geöffnet werden, wo sich die Effektbefehle und deren Parameter für diesen Bereich ganz einfach mit der Maus eintragen lassen. Wenn wir jetzt z. B. das Panning-Beispiel von oben nehmen, können wir es hier visualisieren und durch Verschieben der Slider bearbeiten.<br />
|style="background-color:#eee;"|{{Key|Alt}}+{{Key|B}}<br />
|-<br />
|Grow Selection<br />
|Ein vorher ausgewählter Bereich wird gestreckt, ist also danach doppelt so groß.<br />
|{{Key|Alt}}+{{Key|E}}<br />
|-<br />
|style="background-color:#eee;"|Shrink Selection<br />
|style="background-color:#eee;"|Ein vorher ausgewählter Bereich wurd in seiner Größe halbiert.<br />
|style="background-color:#eee;"|{{Key|Alt}}+{{Key|D}}<br />
|-<br />
|Show row play time<br />
|Zeigt die Zeit an, zu der die markierte Zeile zum ersten mal im Modul erreicht wird (sofern der aktuelle Pattern jemals erreicht wird)<br />
|<br />
|-<br />
|style="background-color:#eee;"|Insert Row<br />
|style="background-color:#eee;"|Im Kanal in dem sich der Cursor befindet, werden die Zeilen unterhalb des Cursors eine Zeile nach unten verschoben. Dadurch werden Zeilen, die sich u. U. am unteren Ende des Patterns befinden, gelöscht.<br />
|style="background-color:#eee;"|{{Key|Einfg}}<br />
|-<br />
|style="border-bottom:1px solid black;"|Delete Row<br />
|style="border-bottom:1px solid black;"|Im Kanal in dem sich der Cursor befindet, wird die Zeile auf der der Cursor liegt gelöscht und die darunter befindlichen Zeilen um eine Position nach oben gerückt.<br />
|style="border-bottom:1px solid black;"|{{Key|Rück}}<br />
|}<br />
<br />
<br />
[[Kategorie:Handbuch]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Handbuch:_General&diff=685
Handbuch: General
2009-04-10T18:14:40Z
<p>Cubaxd: /* Song Properties-Dialog */ Formatierung</p>
<hr />
<div>{{Handbuch TOC}}<br />
<br />
[[Bild:tab_general.png|center]]<br />
Im General-Tab lassen sich die Haupteigenschaften eines Moduls einstellen, wie<br />
etwa das (Start-)Tempo, die Lautstärke der einzelnen Kanäle und das Integrieren<br />
von VST-Plugins in das Modul.<br />
<br />
<br />
===Moduleigenschaften===<br />
<br />
[[Bild:general_misc.png|thumb|460px|right|Tempo, Lautstärke und Modultyp]]<br />
Ganz oben, wo <code>untitled</code> steht, kann man seinem Modul einen Namen geben. Dieser kann je nach Modultyp bis zu 27 Zeichen lang sein.<br />
<br />
Rechts daneben steht die Art des Moduls (hier: <code>IT(ImpulseTracker</code>)) und die Anzahl seiner Kanäle (hier: <code>32 channels</code>). Diese Eigenschaften lassen sich über den darunter liegenden Button {{button|Song&nbsp;Properties}} (wird am Ende dieses Unterkapitels [[#Song_Properties-Dialog|beschrieben]]) abändern.<br />
<br />
<div style="position:relative;float:left;margin-right:8px;"><br />
{|style="border:1px solid #ccc;background-color:#f8f8f8"<br />
|style="background-color:#cef;" colspan="2"|'''Maximale Titellänge'''<br />
|-<br />
|'''Modultyp'''<br />
|'''Länge<br />
|-<br />
|MOD<br />
|20<br />
|-<br />
|XM<br />
|20<br />
|-<br />
|S3M<br />
|27<br />
|-<br />
|IT<br />
|25<br />
|-<br />
|MPTM<br />
|25<br />
|}<br />
</div><br />
<br />
Das Start-Tempo lässt sich mit dem Regler '''Initial Tempo''' oder dem darunter liegenden Eingabefeld abändern. Mögliche Werte liegen hier zwischen <code>32</code> und <code>512</code>. Je höher der Wert, desto schneller ist das Modul. In dem Feld '''Ticks/Row''' beschleunigt ein niedrigerer Wert das Lied. Diese Werte können später im Modul geändert werden, es können also beliebige Tempowechsel eingebaut werden. Jedoch sind dann nur Werte zwischen <code>32</code> und <code>255</code> möglich (Hex: <code>20-FF</code>).<br />
<br />
Im Gegensatz zum '''Initial Tempo''' hat die Einstellung '''Ticks/Row''' entscheidenden Einfluss auf viele Effektbefehle, da dieser Wert eine grundlegende Bedeutung für die internen Berechnungen eines Trackers hat (TODO?).<br />
<br />
Unter '''Restart''' kann man die Neustartposition einstellen, also die Position, an der das Modul neu startet, nachdem es durchlaufen wurde.<br />
<br />
Der Lautstärkeregler '''Initial global vol''' ist für die allgemeine Lautstärke. '''VSTi vol''' ist der Lautstärkeregler für VST-Instrumente und '''Sample vol''' ist für die Lautstärke der Samples gedacht.<br />
<br />
Ist '''Loop Song''' aktiviert, wird das Modul so lange wiederholt, bis man '''Stop''' drückt, wohingegen im deaktivierten Zustand das Modul nur einmal durchlaufen wird.<br />
<br />
Der Button {{button|Player&nbsp;Settings...}} führt zu dem Reiter [[Handbuch:_Setup/Player|Player]] im Setup-Fenster.<br />
<br />
<br />
====Song Properties-Dialog====<br />
[[Bild:window_song_properties.png|thumb|250px|right|Song Properties-Dialog]]<br />
Im oberen Bereich ('''Type''') kann die Art des Moduls gewählt werden. Hier lässt sich das geöffnete Modul in ein anderes Format konvertieren. Mögliche Formate sind MOD, S3M, XM, IT, ITP und MPTM.<br />
<br />
Neben der Einstellung für den Modultyp ist ein weiteres Auswahlfeld, wo du die Anzahl der Kanäle deines Moduls einstellen kannst. Abhängig von der Art des Moduls kannst du hier zwischen 4 und 127 Kanäle einstellen. Falls du noch nicht weißt, wie viele Kanäle du brauchst, empfiehlt es sich daher, entweder IT oder MPTM zu benutzen, da diese Formate die größte Anzahl an Kanälen unterstützen.<br />
----<br />
Im Abschnitt '''Tempo''' können verschiedene Tempo-Modi ausgewählt werden. Nur der "Classic"-Modus wird auch von anderen Trackern verstanden.<br />
----<br />
Im Abschnitt '''Playback''' kannst du die Kompatibilität zu den Original-Trackern oder früheren Versionen von ModPlug / OpenMPT maximieren:<br />
* '''Linear Frequency Slides''': Ist diese Option aktiviert, ist bei einem [[Portamento]] die Frequenz der aktuell gespielten Note egal &ndash; Der Effekt wird immer gleich "schnell" ausgeführt ({{eff|E26}} würde bei Tempo 6 z.B. immer exakt eine Oktave nach unten gehen).<br />
* '''Fast Volume Slides''': Gibt's nur im S3M-Format. [[Lautstärke#Volume-Slide (Note)|Volume Slides]] werden dabei etwas schneller ausgeführt.<br />
* '''Extended Filter Range''': Lowpass- und Highpass-Filter decken ein größeres Frequenz-Spektrum ab.<br />
{{Hinweis|Kompatiblitäts-Tipp:|Der Lowpass-Filter von OpenMPT arbeitet bekanntlich anders als der im Impulse Tracker. Aktiviere "Extended Filter Range", um die Bandbreite des Filters in OpenMPT zu erweitern. Dadurch klingt der Filter zwar immer noch anders, aber XMPlay wird dann bei deinen Modulen den ModPlug-Filter und nicht den Impulse Tracker-Filter anwenden!}}<br />
* '''IT Old Effects''': Hierbei werden einige Effektbefehle wie in früheren Versionen des Impulse Trackers interpretiert.<br />
* '''IT Compatible Gxx''': Wenn diese Option ''deaktiviert'' ist, wird der Effektspeicher von {{eff|G}}''xx'' mit dem von {{eff|E}}''xx'' und {{eff|F}}''xx'' geteilt (allerdings nur, wenn das Flag "More IT compatible playback" aktiviert ist). Ein {{eff|F04}}, gefolgt von einem {{eff|G00}} ist dann also equivalent zu {{eff|F04}} und {{eff|G04}}. Außerdem setzen im Instrumenten-Modus auch mit {{eff|G}}''xx'' angeschlagene Noten die Hüllkurven (Lautstärke, Panning, Pitch / Filter) zurück.<br />
* '''Mix Levels''': Verschiedene Lautstärkemodi, die Hauptsächlich das Handling von VST(i)-Effekten beeinflussen. Möchtest du VST(i)-Effekte benutzen, solltest du jeweils den aktuellsten Mix-Modus (im Moment RC3) verwenden - Sonst können ungewünschte Effekte auftreten. Der Modus "Original" ist dagegen näher an den Lautstärkepegeln der Original-Tracker.<br />
* '''Miscellaneous flags''': Hier handelt es sich um 3 weitere Optionen, die allerdings auf eine etwas andere Weise ein- bzw. ausgeschaltet werden müssen. Jede der Optionen lässt sich aktivieren, indem die entsprechende Ziffer auf 1 gesetzt wird. Auf der Position ganz links lässt sich die Kompatibilität zum Impulse Tracker weiter erhöhen (Wiedergabe).<!-- Die anderen sagen mir gar nix :( --><br />
----<br />
Bei der Versionsinfo steht, mit welcher Version von OpenMPT das Modul erstellt und mit welcher es zuletzt gespeichert wurde.<br />
<br clear="all"/><br />
{{Hinweis|Beim Konvertieren solltest du bedenken, ...|dass aufgrund der unterschiedlich großen Befehlsumfänge der Module, sowie aufgrund von Eigenheiten der verschiedenen Formate die Konvertierung unter Umständen ganz böse verlaufen kann.<br/>Allgemein ist es besser, du machst dir vorher Gedanken, in welchem Format du ein Modul erstellen willst, da das Anpassen nach einer Konvertierung recht mühsam sein kann. Bei einem ''frischen'' Modul brauchst du dir darüber natürlich keine Gedanken zu machen ;-).}}<br />
<br />
===Kanaleigenschaften===<br />
[[Bild:general_channels.png|thumb|400px|left|Kanaleigenschaften]]<br />
In dem hier abgebildeten Fensterbereich kann man die Werte für die einzelnen Kanäle ändern. Es werden jeweils immer 4 Kanäle angezeigt. Je nachdem, wie viele Kanäle man in seinem Modul hat, sieht man oben eine Karteiliste, über die sich eine Gruppe von jeweils 4 Kanälen auswählen lässt.<br />
<br />
Direkt darunter steht immer, welche Kanäle man gerade angezeigt bekommt (z.B. <code>Channel 1</code>).<br />
<br />
In der weißen Fläche kann man jedem Kanal einen individuellen Namen geben.<br />
<br />
Anfangslautstärke und -Panning (also das Links-Rechts-Verhältnis eines Kanals) kann man mit den Eingabefeldern, bzw. Schiebereglern verändern. Die Lautstärke lässt sich zwischen <code>0</code> und <code>64</code> einstellen und das Panning zwischen <code>0</code> (Links), <code>128</code> (Mitte) und <code>256</code> (Rechts).<br />
<br />
Ist {{button|Mute}} aktiviert, ist der Kanal stumm geschaltet.<br />
<br />
Mit {{button|Surround}} lässt sich Surround für einen bestimmten Kanal ein- bzw. abschalten.<br />
<br />
Über '''Effect''' lassen sich für jeden Kanal Effekte hinzufügen, auf die wir im nächsten<br />
Abschnitt eingehen.<br />
<br />
<br />
===Plugins===<br />
{{Hinweis|Hinweis:|Plugins werden nur in IT-, XM- und MPTM-Modulen gespeichert und werden von keinem anderen Tracker oder Player interpretiert. Ausnahme: DMO-Effekte werden von XMPlay verstanden.}}<br />
<br />
[[Bild:general_plugins.png|thumb|right|440px|Hier werden Plugins integriert und ihre Parameter eingestellt]]<br />
Es lassen sich 3 Typen von Effekten integrieren:<br />
* VST-Effekte<br />
* VST-Instrumente<br />
* DirectX-Audio-Effekte (Auch bekannt als "DMO")<br />
Letztere sind normalerweise auf jedem Windows-Rechner mit DirectX (ab Version 8) schon vorinstalliert. Diese Effekte sind zwar nicht die besten und es sind auch nicht viele, aber sie haben den Vorteil, dass sie auch von anderen Playern verstanden werden ([http://un4seen.com/xmplay.html XMPlay] unterstützt DMO-Effekte beispielsweise). Über den Button {{button|Select}} (In der Abbildung rechts in der Mitte) kann man auf diese Effekte zugreifen. Es öffnet sich dann ein Fenster, der [[Handbuch: Plugin Manager|Plugin Manager]], mit einer Liste aller verfügbaren Plugins, die den 3 oben genannten Kategorien untergeordnet sind. In diesem Fenster können über den Button {{button|New&nbsp;Plugin...}} neue Plugins der Liste hinzugefügt werden. Diese sind für gewöhnlich <code>dll</code>-Dateien.<br />
<br />
{{Hinweis|Mehrere Dateien gleichzeitig ...|kannst du der Liste hinzufügen, indem du nach einem Klick auf '''New Plugin...''' im daraufhin erscheinenden Dateiauswahldialog die Strg-Taste gedrückt hältst und die Dateien anwählst die du deiner Liste hinzufgen möchtest.<br/><br/>Wenn du einen Bereich oder gleich alle Plugin-Dateien in einem Verzeichnis hinzufügen möchtest, klickst du die erste Datei an. Danach gehst du zur letzten Datei und wählst diese nun bei gedrückter Shift-Taste an. Dies sollte den gesamten Bereich zwischen diesen beiden Dateien anwählen. Nun brauchst du nur noch auf '''öffnen''' zu klicken und alle angewählten Dateien werden nun der Liste hinzugefügt (sofern es sich bei diesen Dateien auch um Plugins handelt).}}<br />
<br />
Insgesamt können 100 Effekte gleichzeitig genutzt werden. Möchte man einen Effekt hinzufügen, kann man durch drücken des Buttons {{button|>>}} zu einem undefinierten Bereich weiterschalten und danach wieder {{button|Select}} drücken, um einen Effekt auszuwählen.<br />
<br />
Ist ein Plugin geladen worden, kann man nach drücken auf {{button|Edit...}} die Parameter der Funktionen verändern, die von dem jeweiligen Plugin bereitgestellt werden.<br />
<br />
Durch das Drücken auf {{button|Move}} kann man einen Effekt auf einen beliebigen anderen Effektplatz verschieben.<br />
<br />
Mit {{button|Insert...}} kann man vor dem aktuellen Plugin ein Plugin dazwischenschieben. Dies ist dann sinnvoll, wenn man die Soundausgabe des neuen Plugins auf den Eingang des anderen umleiten will. Dies funktioniert nämlich nur von einem niedrigen Effektplatz auf einen Hohen.<br />
<br />
====Mix Settings====<br />
{|<br />
|style="background-color:#eee;"|Master<br />
|style="background-color:#eee;"|Das Plugin wird auf alle Kanäle gleichzeitig angewendet. Dieses Plugin kann dann durch lokale Plugins, die du auf bestimmte Kanäle oder Instrumente anwendest, ersetzt werden. Pro Kanal ist nämlich nur ein Plugin möglich.<br />
|-<br />
|Bypass<br />
|Hier lässt sich die Ausgabe des Plugins umgehen<br />
|-<br />
|style="background-color:#eee;"|Dry Mix<br />
|style="background-color:#eee;"|Das Einschalten dieser Option lässt die Ausgabe trockener klingen. Hier wird die Originalausgabe mit der des Plugins vermischt.<br />
|-<br />
|Wet-Dry-Regler<br />
|Ist ein Plugin geladen, kann man in dem Regler daneben einstellen, ob die Soundausgabe komplett über das Plugin laufen soll (100% wet), oder ob die Soundausgabe des Plugins mit der regulären vermischt werden soll. Ist der Regler ganz rechts, klingt der Sound trockener.<br />
|-<br />
|style="background-color:#eee;"|Mix-Mode<br />
|style="background-color:#eee;"|Gibt an, wie das Ausgangssignal aus dem Originalsignal und der Ausgabe des VSTs berechnet werden soll.<br />
|-<br />
|Gain<br />
|Hier kann man die Vorverstärkung des Plugins einstellen. x1.0 ist Standard.<br />
|-<br />
|style="background-color:#eee;"|Output to<br />
|style="background-color:#eee;"|Hier kannst du bestimmen, an welches VST-Plugin die Ausgabe dieses Plugins gesendet werden soll (bei DMO-Effekten nicht möglich)<br />
|}<br />
<br />
<br />
[[Kategorie:Handbuch]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php&diff=655
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php
2009-02-02T21:44:42Z
<p>Cubaxd: /* MPTPatterns.class.php */</p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.class.php==<br />
<pre><br />
<?<br />
###############################################################################<br />
# MPTPatterns class<br />
# (c)opyleft 2009 cubaxd<br />
###############################################################################<br />
<br />
class MPTPatterns {<br />
<br />
var $env=array(); // Settings<br />
var $attr=array(); // Attributes<br />
var $mod=array(); // Pattern data<br />
var $seq=array(); // Input data<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* Pattern($input, $args, $parser)<br />
*<br />
* 'main' function<br />
*/<br />
function Pattern($input, $args, $parser) {<br />
// Read attributes<br />
$this->readAttributes($args);<br />
<br />
// The pattern data splitted at the new line char<br />
$this->seq = split("\n", htmlspecialchars($input));<br />
<br />
// Determine module format<br />
$this->getFormat();<br />
<br />
// Write input data into an array for HTML conversion<br />
$this->readPattern();<br />
<br />
// Convert data to HTML<br />
return $this->printPattern();<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* readAttributes()<br />
*<br />
* Reads all attributes of the pattern tag.<br />
* If an attribute X is empty/not set, the corresponding<br />
* attr['X'] variable is set to null by the function getAttribute(),<br />
* otherwise it will be set to the attribute's value, whith<br />
* argument 2 ($option) of getAttribute() determining<br />
* how to assign the value:<br />
* 0 (null): assign value unchanged,<br />
* 1 ($numeric): assign value only if numeric<br />
* 2 ($lowercase): convert to lowercase letters<br />
* 3 ($uppercase): convert to uppercase letters<br />
* 4 ($colorcode): assign if value is valid color code<br />
*/<br />
private function readAttributes($args) {<br />
$numeric=1; $lowercase=2; $uppercase=3; $colorcode=4;<br />
<br />
$this->attr['title'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['title']], null);<br />
$this->attr['titlefg'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titlefg']], $colorcode);<br />
$this->attr['titlebg'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titlebg']], $colorcode);<br />
/* titleborder uses a color code, but can also have the value "off" */<br />
$this->attr['titleborder'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titleborder']], null);<br />
/* bordercolor uses a color code, but can also have the value "off" */<br />
$this->attr['bordercolor'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['bordercolor']], null);<br />
$this->attr['width'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['width']], $numeric);<br />
$this->attr['format'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['format']], $uppercase);<br />
$this->attr['identifier'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['identifier']], $lowercase);<br />
$this->attr['highlight'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['highlight']], $numeric);<br />
$this->attr['fontsize'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['fontsize']], null);<br />
$this->attr['bold'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['bold']], $lowercase);<br />
$this->attr['frame'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['frame']], $lowercase);<br />
$this->attr['align'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['align']], $lowercase);<br />
$this->attr['colorscheme'] = $this->getColorScheme(<br />
$args[$this->env['attribute'][$this->language]['colorscheme']]);<br />
$this->attr['lineheight'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['lineheight']], null);<br />
$this->attr['columnwidth'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['columnwidth']], null);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getAttribute($val, $option)<br />
*<br />
* Checks an attribute of the pattern tag, converts its value if needed<br />
* and returns the data<br />
*<br />
* @param any $val<br />
* value of the given attribute<br />
* @param integer $option<br />
* 0: off<br />
* 1: check if numeric<br />
* 2: return value in lowercase letters<br />
* 3: return value in uppercase letters<br />
* 4: check for color code (#RR?GG?BB?)<br />
*/<br />
private function getAttribute($val, $option=null) {<br />
$numeric=1; $lowercase=2; $uppercase=3; $colorcode=4;<br />
if (isset($val)) {<br />
<br />
switch ($option) {<br />
<br />
case $numeric:<br />
return ( is_numeric($val) ) ? $val : null;<br />
break;<br />
<br />
case $lowercase:<br />
return strtolower(htmlspecialchars($val));<br />
break;<br />
<br />
case $uppercase:<br />
return strtoupper(htmlspecialchars($val));<br />
break;<br />
<br />
case $colorcode:<br />
return $this->isValidColor($val);<br />
break;<br />
<br />
}<br />
return htmlspecialchars($val);<br />
}<br />
// Attribute not set<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getColorScheme()<br />
*<br />
* Read attribute 'colorscheme' and test if the parameter is valid.<br />
* If not, the standardscheme is used. If this isn't valid either,<br />
* we gonna use the first scheme in the 'colorschemes' list.<br />
*/<br />
private function getColorScheme($arg) {<br />
<br />
if (isset($arg) )<br />
$scheme = strtoupper(htmlspecialchars($arg));<br />
elseif (!$this->isSwitchedOff($this->attr['frame'] ) )<br />
$scheme = strtoupper($this->env['standardcolorscheme']);<br />
else<br />
$scheme = strtoupper($this->env['standardcolorschemenoframe']);<br />
<br />
for ($i=0; $i<count($this->env['colorschemes']); $i++) {<br />
if ($this->env['colorschemes'][$i]==$scheme) {<br />
# set scheme for later use<br />
$this->mod['scheme'] = $scheme;<br />
$this->attr['colorscheme'] = $scheme;<br />
return $scheme;<br />
}<br />
}<br />
<br />
// if the 'standardcolorscheme' is invalid, use the first entry<br />
return $this->env['colorschemes'][0];<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isValidColor()<br />
*<br />
* Checks, if a color code is valid. Valid params are only #RrGgBb or #RGB.<br />
* If the check was successful, the color is returned, otherwise null.<br />
*/<br />
private function isValidColor($col) {<br />
if (preg_match("/^#[0-9A-Fa-f]{3}$/", $col) == 0)<br />
if (preg_match("/^#[0-9A-Fa-f]{6}$/", $col) == 0)<br />
return null;<br />
<br />
return $col;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* objectWidth()<br />
*<br />
* Compares the width with the min and max width values and returns<br />
* it modified if needed. If the width is numeric, that is, not 'auto',<br />
* the measure (defined in the settings file) is added.<br />
* If the with is 200 and measure is 'px', then '200px' is returned<br />
*<br />
*/<br />
private function objectWidth() {<br />
// check if standard width is a valid parameter and set to 'auto' if not<br />
if (!is_numeric($this->env['objectwidth']) || $this->env['objectwidth']!='auto' )<br />
$this->env['objectwidth']='auto';<br />
<br />
// width attribute not set. use standard width<br />
if (is_null($this->attr['width']))<br />
$ret = $this->env['objectwidth'];<br />
<br />
// check min and max width<br />
if ($this->attr['width'] > $this->attr['objectmaxwidth'])<br />
$ret = $this->env['objectmaxwidth'];<br />
if ($this->attr['width'] < $this->attr['objectminwidth'] )<br />
$ret = $this->env['objectminwidth'];<br />
<br />
// width parameter okay<br />
if (is_numeric($ret))<br />
return $ret.$this->env['objectmeasure'];<br />
<br />
return $ret;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getFormat()<br />
*<br />
* Search for identifier string in pattern, or if the search was<br />
* unsuccessful, try to read the 'format' attribute.<br />
* This is neccessary as we must know which effect commands to highlight<br />
* in which color. If the format was not determined, the standard format<br />
* will be used, which defaults to the Impulse Tracker format, but can be<br />
* changed in the settings to any other format in the list.<br />
*<br />
* $attr['format'] will contain the short identifier (i.e: "S3M"), and<br />
* $mod['format'] the long one ("ModPlug Tracker S3M")<br />
*/<br />
private function getFormat() {<br />
// try to read Identifier string<br />
// (which usually begins with "ModPlug Tracker ")<br />
for ($i=0; $i<count($this->seq); $i++) {<br />
<br />
// compare current $input line with ID strings<br />
for ($j=0; $j<count($this->env['format_long']); $j++)<br />
if ($this->seq[$i] == $this->env['format_long'][$j])<br />
$this->mod['format']=$this->env['format_long'][$j];<br />
<br />
// Identifier found, we can abort the loop now<br />
if ($this->mod['format'])<br />
break;<br />
<br />
// as soon as the first '|' character appears, it is unlikely for<br />
// the identifier string to appear since it is usually at the top<br />
// of the copied pattern.<br />
if (substr($this->seq[$i], 0, 1) == $this->env['divider'])<br />
break;<br />
}<br />
<br />
// ... the identifier string couldn't be found in the pattern.<br />
// Let's try it via the format attribute of the <pattern> tag<br />
if (!$this->mod['format']) {<br />
<br />
// Look if the "format" attribute is set.<br />
if (!is_null($this->attr['format']) && $this->attr['format']>'') {<br />
<br />
// compare the attribute value with all ID strings<br />
for ($i=0; $i<count($this->env['format_long']); $i++) {<br />
<br />
// format string valid<br />
if ($this->attr['format'] == $this->env['format_short'][$i]) {<br />
<br />
// assign<br />
$this->mod['format']=$this->env['format_long'][$i];<br />
}<br />
}<br />
}<br />
// neither identifier string found, nor format attribute set<br />
// We're going to use the standard format in this case<br />
else<br />
$this->mod['format'] = $this->getLongIdentifier($this->env['standardformat']);<br />
<br />
}<br />
// set the short name of the identifier<br />
$this->attr['format'] = $this->getShortIdentifier($this->mod['format']);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getLongIdentifier()<br />
* returns the long ID of a short one<br />
* (i.e. "IT" --> "ModPlug Tracker IT" )<br />
*/<br />
private function getLongIdentifier($short) {<br />
for ($i=0; $i<$this->env['format_short']; $i++)<br />
if ($short == $this->env['format_short'][$i])<br />
return $this->env['format_long'][$i];<br />
<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getShortIdentifier()<br />
*<br />
* the opposite of getLongIdentifier()<br />
*/<br />
private function getShortIdentifier($long) {<br />
for ($i=0; $i<$this->env['format_long']; $i++)<br />
if ($long == $this->env['format_long'][$i])<br />
return $this->env['format_short'][$i];<br />
<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getLineHeight()<br />
*<br />
* If lineheight argument is not set, the standard value will be used<br />
*/<br />
private function getLineHeight() {<br />
if (isset($this->attr['lineheight']) && strlen($this->attr['lineheight'])<=6) {<br />
if (is_numeric($this->attr['lineheight'])) {<br />
// if unit was not specified, use 'px'<br />
return $this->attr['lineheight'].'px';<br />
}<br />
return $this->attr['lineheight'];<br />
}<br />
return $this->env['patternlnheight'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getColumnWidth()<br />
*<br />
*If colwidth argument is not set, the standard value will be used<br />
*/<br />
private function getColumnWidth() {<br />
if (isset($this->attr['columnwidth']) && strlen($this->attr['columnwidth'])<=6) {<br />
if (is_numeric($this->attr['lineheight'])) {<br />
// if unit was not specified, use 'px'<br />
return $this->attr['columnwidth'].'px';<br />
}<br />
return $this->attr['columnwidth'];<br />
}<br />
return $this->env['patterncolwidth'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* checkFontSize($arg)<br />
*<br />
* Test if attribute fontsize was set and check for the allowed range<br />
* The fontsize is returned together with the size measure unit.<br />
* For example, if the size is 12, and the unit px, then 12px is returned.<br />
* The measure and the min and max font size can be changed in the<br />
* settings file.<br />
*/<br />
private function checkFontSize($arg)<br />
{<br />
if (!is_null($arg) ) {<br />
if (is_numeric($arg) ) {<br />
// font size smaller than minimum allowed size?<br />
if ($arg<$this->env['fontsizemin']) {<br />
if (is_numeric($this->env['fontsizemin']))<br />
return $this->env['fontsizemin'].$this->env['fontmeasure'];<br />
else<br />
// if the fontsize in the settings is not numeric<br />
// return this standard size<br />
return "12px";<br />
}<br />
// font size greater than max allowed size?<br />
elseif ($arg>$this->env['fontsizemax']) {<br />
if (is_numeric($this->env['fontsizemax']))<br />
return $this->env['fontsizemax'].$this->env['fontmeasure'];<br />
else<br />
return "12px";<br />
}<br />
else<br />
return $arg.$this->env['fontmeasure'];<br />
<br />
# XXX a size parameter with measure would make the<br />
# XXX fontsize limit settings useless<br />
# }<br />
# else {<br />
# // fontsize parameter is not numeric. Maybe it is a<br />
# // number with a unit 'suffix'?<br />
# if (preg_match('/^[0-9]{1,2}px$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{0,1}.?[0-9]{0,2}em$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{1,4}%$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{1,2}pt$/', $arg) )<br />
#<br />
<br />
}<br />
} # !is_null<br />
return $this->env['fontsize'].$this->env['fontmeasure'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isSwitchedOff($val)<br />
*<br />
* returns true if an attribute's value is 'off'<br />
*/<br />
private function isSwitchedOff($val) {<br />
if ($val == $this->env['txt'][$this->language]['off'])<br />
return true;<br />
return false;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isSwitchedOn($val)<br />
*<br />
* returns true if an attribute's value is 'on'<br />
*/<br />
private function isSwitchedOn($val) {<br />
if ($val == $this->env['txt'][$this->language]['on'])<br />
return true;<br />
return false;<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getEffectColor($eff)<br />
*<br />
* returns the color for a particular effect<br />
*/<br />
private function getEffectColor($eff) {<br />
<br />
for ($i=0; $i<count($this->env['categories']); $i++)<br />
if (preg_match("/".substr($eff,0,1)."/",<br />
$this->env['fx'][$this->attr['format']][$this->env['categories'][$i]] ) )<br />
return $this->env['colorscheme'][$this->attr['colorscheme']][$this->env['categories'][$i]];<br />
<br />
// Couldn't find effect - use default color<br />
return $this->env['colorscheme'][$this->attr['colorscheme']]['default'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* setLink($eff)<br />
*<br />
* add MediaWiki link to an effect<br />
*/<br />
/* NOT YET IMPLEMENTED<br />
private function setLink($eff, &$parser) {<br />
$category = array ('global','panning','volume','pitch','other');<br />
<br />
<br />
if ($seite>'')<br />
return $parser->recursiveTagParse("[[$seite|$eff]]");<br />
else<br />
return $eff;<br />
}<br />
*/<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* addCSSData()<br />
*<br />
* fills the spanTag() with style data<br />
*/<br />
private function addCssData(<br />
$dat, /* the text itself */<br />
$css_color, /* color */<br />
$css_font, /* font */<br />
$css_fontweight, /* font-weight */<br />
$css_fontsize, /* font-size */<br />
$css_padding_left, /* padding-left */<br />
$css_padding_right, /* padding-right */<br />
$css_line_height, /* line-height */<br />
$css_background='' /* background */<br />
)<br />
{<br />
return $this->spanTag( $dat,<br />
"color:$css_color;".<br />
(!is_null( $css_font )<br />
? "font-family:$css_font;" : '').<br />
(!is_null( $css_fontweight )<br />
? "font-weight:$css_fontweight;" : '').<br />
(!is_null( $css_fontsize )<br />
? "font-size:$css_fontsize;" : '').<br />
(!is_null( $css_padding_left )<br />
? "padding-left:$css_padding_left;" : '').<br />
(!is_null( $css_padding_right )<br />
? "padding-right:$css_padding_right;" : '').<br />
(!is_null( $css_line_height )<br />
? "line-height:$css_line_height;" : '').<br />
(!is_null( $css_background )<br />
? "background:$css_background;" : '')<br />
);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* spanTag()<br />
* returns a <span> tag with style and data<br />
*/<br />
private function spanTag($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* space2Nbsp($str)<br />
*<br />
* returns string $str with the first of two successive space characters<br />
* converted to a non-breaking space.<br />
*/<br />
private function space2Nbsp($str) {<br />
return preg_replace('/ /', "\x26nbsp; ", $str);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* setAlignment()<br />
*<br />
* checks the align attribute's parameter and returns CSS data depending<br />
* on whether the alignment was left, center, or right<br />
*/<br />
private function setAlignment() {<br />
<br />
# i18n<br />
$left = $this->env['txt'][$this->language]['left'];<br />
$center = $this->env['txt'][$this->language]['center'];<br />
$right = $this->env['txt'][$this->language]['right'];<br />
<br />
$clear = (($this->env['objectclear']>'')<br />
? "clear:{$this->env['objectclear']};"<br />
: '');<br />
<br />
# check, if settings are correct. If not, use 'left'<br />
if ($this->env['objectalign']!='left'<br />
&& $this->env['objectalign']!='center'<br />
&& $this->env['objectalign']!='right'<br />
)<br />
$this->env['objectalign']='left';<br />
<br />
# if attribute align doesn't have a valid value, use the standard<br />
if ( is_null($this->attr['align'])<br />
|| ($this->attr['align']!=$left<br />
&& $this->attr['align']!=$center<br />
&& $this->attr['align']!=$right)<br />
)<br />
$this->attr['align']=<br />
$this->env['txt'][$this->language][$this->env['objectalign']];<br />
<br />
if ($this->attr['align']==$left)<br />
return "float:left;margin-right:{$this->env['objectmargin']};$clear";<br />
<br />
if ($this->attr['align']==$right)<br />
return "float:right;margin-left:{$this->env['objectmargin']};$clear";<br />
<br />
return "$clear";<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* replaceCharsWithNewLine()<br />
*<br />
* replace $env['newlinechars'] (see settings) by new line in $txt<br />
*/<br />
private function replaceCharsWithNewLine($txt) {<br />
if ($this->env['newlinechars']>'')<br />
$pattern = "/{$this->env['newlinechars']}/";<br />
else<br />
// no newlinechars specified - return string unmodified<br />
return $txt;<br />
<br />
if (preg_match($pattern, $txt ) )<br />
return preg_replace($pattern, "<br />", $txt);<br />
<br />
// no newlinechars found, return unmodified<br />
return $txt;<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* readPattern()<br />
*<br />
* writes the pattern data into an array<br />
*/<br />
private function readPattern() {<br />
// Read every line<br />
// $zeile ist a line in the input array $this->seq<br />
// $row is a line in the output array $mod['dat']<br />
$row=0;<br />
for ($zeile=0; $zeile<count($this->seq); $zeile++) {<br />
// Lines shorter than 12 chars and/or lines not beginning with `|'<br />
// are ignored<br />
<br />
# limit rows<br />
if ($row>=$this->env['maxrows'])<br />
break;<br />
<br />
if ( (strlen($this->seq[$zeile]) >= $this->env['bytesperchannel'] )<br />
&& (substr($this->seq[$zeile], 0, 1) == $this->env['divider']) )<br />
{<br />
// each channel consists of 'bytesperchannel' bytes<br />
for ($pos=0, $channel=0;<br />
$pos<strlen($this->seq[$zeile]);<br />
$pos+=$this->env['bytesperchannel'], $channel++)<br />
{<br />
# limit the number of channels<br />
if ($channel>=$this->env['maxchannels'])<br />
break;<br />
<br />
// Check if a channel's first byte is the divider char ('|'),<br />
// This way we avoid having nonsense in the output array.<br />
if (substr($this->seq[$zeile], $pos, strlen($this->env['divider']))<br />
== $this->env['divider'])<br />
{<br />
$p=strlen($this->env['divider']);<br />
<br />
# Note (3 chars: 1-3 (first char is 0))<br />
$this->mod['dat'][$row][$channel]['note']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['lennote']);<br />
<br />
$p+=$this->env['lennote'];<br />
# Instrument (2 chars: 4-5)<br />
$this->mod['dat'][$row][$channel]['instr']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['leninstr']);<br />
<br />
$p+=$this->env['leninstr'];<br />
# Volume (3 chars: 6-8)<br />
$this->mod['dat'][$row][$channel]['vol']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['lenvol']);<br />
<br />
$p+=$this->env['lenvol'];<br />
# Effect (3 chars: 9-11)<br />
// if there is an effect without param, convert '..' to '00'<br />
$this->mod['dat'][$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\#])\.\.', '\100',<br />
substr($this->seq[$zeile], $pos+$p, $this->env['lenfx']));<br />
<br />
}<br />
}<br />
// $row is the index of the output array. If we would use $zeile<br />
// as its index, every empty or invalid entry of the input array<br />
// would increase the counter and thus give us "false positives"<br />
$row++;<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* convPattern2Html()<br />
*<br />
* converts the pattern data to html<br />
*/<br />
private function convPattern2Html() {<br />
$ret=null;<br />
$scheme = $this->getColorscheme($this->attr['colorscheme']);<br />
<br />
<br />
// use standard highlight, if attribute highlight was not specified<br />
if ($this->attr['highlight']===null)<br />
$this->attr['highlight']=$this->env['stdhighlight'];<br />
<br />
<br />
// merge data array<br />
for ($row=0; $row<count($this->mod['dat']); $row++) {<br />
for ($channel=0; $channel<count($this->mod['dat'][$row]); $channel++) {<br />
<br />
// Attribute highlight="X": Highlight every Xth line<br />
if ($this->attr['highlight']>0)<br />
$background = ($row % $this->attr['highlight']==0)<br />
? $this->env['colorscheme'][$scheme]['bghighl'] : '';<br />
<br />
// some shortcuts<br />
$note = $this->mod['dat'][$row][$channel]['note'];<br />
$instr= $this->mod['dat'][$row][$channel]['instr'];<br />
$vol = $this->mod['dat'][$row][$channel]['vol'];<br />
$eff = $this->mod['dat'][$row][$channel]['eff'];<br />
<br />
# Divider<br />
$ret.= $this->addCssData(<br />
/* data */ $this->env['divider'],<br />
/* color */ $this->env['colorscheme'][$scheme]['divider'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ null,<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ null, #$this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Note<br />
$ret.= $this->addCssData(<br />
/* data */ $note,<br />
/* color */ (substr($note,0,1) == '.' )<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->env['colorscheme'][$scheme]['note'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Instrument<br />
$ret.= $this->addCssData(<br />
/* data */ $instr,<br />
/* color */ (substr($instr,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->env['colorscheme'][$scheme]['instr'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Volume Column<br />
$ret.= $this->addCssData(<br />
/* data */ $vol,<br />
/* color */ (substr($vol,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->getEffectColor($vol),<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Effect Column<br />
$ret.= $this->addCssData(<br />
/* data */ $eff,<br />
/* color */ (substr($eff,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->getEffectColor($eff),<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
}<br />
$ret.="<br />";<br />
} # for ($row ...<br />
return $ret;<br />
}<br />
<br />
private function getBorderSide($arg) {<br />
switch ($arg) {<br />
case 'top': return 'border-top';<br />
case 'right': return 'border-right';<br />
case 'bottom': return 'border-bottom';<br />
case 'left': return 'border-left';<br />
default: return 'border';<br />
}<br />
}<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* printPattern()<br />
*<br />
*<br />
*/<br />
private function printPattern() {<br />
$ret = '';<br />
<br />
# only add frame if it is not turned off<br />
$with_frame = ($this->isSwitchedOff($this->attr['frame'])) ? false : true;<br />
# a title is only added if the pattern has a frame<br />
$with_title = (is_null($this->attr['title']) || $this->attr['title']=='') ? false : true;<br />
<br />
$scheme = $this->mod['scheme'];<br />
<br />
// open div. this can be turned off by using attribute 'frame="off"'<br />
if ($with_frame) {<br />
<br />
$frame_width = "width:".($this->objectWidth()).";";<br />
<br />
// frame border: if not specified, the border is turned off<br />
if (is_null($this->attr['bordercolor'])) {<br />
if ($this->env['bordercol']>'') {<br />
// use standard color, defined in the settings file<br />
if ($this->isValidColor($this->env['bordercol']))<br />
$frame_border = "border:1px solid {$this->env['bordercol']};";<br />
// standard color wrong, use to show there is an err<br />
else<br />
$frame_border = "border:2px solid #f00;";<br />
}<br />
else<br />
$frame_border = '';<br />
}<br />
elseif ($this->isValidColor($this->attr['bordercolor']))<br />
$frame_border = "border:1px solid {$this->attr['bordercolor']};";<br />
elseif ($this->isSwitchedOff($this->attr['bordercolor']))<br />
$frame_border='';<br />
else {<br />
# show that value is wrong by using a red border<br />
$frame_border = 'border:2px solid #f00;';<br />
}<br />
<br />
$frame_padding = "padding:1px:";<br />
<br />
if ($this->isValidColor($this->env['framecol']))<br />
$frame_bg = "background:{$this->env['framecol']};";<br />
else<br />
$frame_bg = '';<br />
<br />
$frame_align = $this->setAlignment();<br />
<br />
$ret.="<div style=\"$frame_width$frame_border$frame_padding$frame_bg$frame_align\">";<br />
<br />
// add title div<br />
// this is a long list of conditions, because<br />
// style elements are only added if they are set.<br />
if ($with_title) {<br />
<br />
$title_width = "width:auto;";<br />
<br />
// background:<br />
if (is_null($this->attr['titlebg']))<br />
if ($this->isValidColor($this->env['titlebgcol'])!=null)<br />
$title_background = "background:{$this->env['titlebgcol']};";<br />
else<br />
$title_background = "background:#ccc;";<br />
else<br />
$title_background = "background:{$this->attr['titlebg']};";<br />
<br />
// color:<br />
if (is_null($this->attr['titlefg']))<br />
if ($this->isValidColor($this->env['titlefgcol'])!=null)<br />
$title_color = "color:{$this->env['titlefgcol']};";<br />
else<br />
$title_color = "color:#000;";<br />
else<br />
$title_color = "color:{$this->attr['titlefg']};";<br />
<br />
// font-family:<br />
if ( $this->env['titlefontfamily'] > '')<br />
$title_fontfamily = "font-family:{$this->env['titlefontfamily']};";<br />
else<br />
$title_fontfamily = '';<br />
<br />
// font-size:<br />
if ($this->env['titlefontsize'] > '')<br />
$title_fontsize = "font-size:{$this->env['titlefontsize']};";<br />
else<br />
$title_fontsize = '';<br />
<br />
// font-weight<br />
if ($this->env['titlefontweight'] > '')<br />
$title_fontweight = "font-weight:{$this->env['titlefontweight']};";<br />
else<br />
$title_fontweight = '';<br />
<br />
// text-decoration<br />
if ($this->env['titledecoration'] > '')<br />
$title_textdecoration = "text-decoration:{$this->env['titledecoration']};";<br />
else<br />
$title_textdecoration = '';<br />
<br />
// text-align:<br />
if ($this->env['titletextalign'] > '')<br />
$title_textalign = "text-align:{$this->env['titletextalign']};";<br />
else<br />
$title_textalign = "text-align:center;";<br />
<br />
// padding:<br />
if ($this->env['titlepadding'] > '')<br />
$title_padding = "padding:{$this->env['titlepadding']};";<br />
else<br />
$title_padding = '';<br />
<br />
// border: if not specified, the border is turned off<br />
$side = $this->getBorderSide($this->env['titleborderside']);<br />
if (is_null($this->attr['titleborder'])) {<br />
if ($this->env['titlebordercol']>'') {<br />
// use standard color, defined in the settings file<br />
if ($this->isValidColor($this->env['titlebordercol'])) {<br />
$title_border = "{$side}:".<br />
"1px solid {$this->env['titlebordercol']};";<br />
}<br />
// standard color wrong, use red to show there is an err<br />
else {<br />
$title_border = "{$side}:2px solid #f00;";<br />
}<br />
}<br />
else<br />
$title_border = '';<br />
}<br />
// use colorcode specified using the attribute titleborder<br />
elseif ($this->isValidColor($this->attr['titleborder'])) {<br />
$title_border = "{$side}:".<br />
"1px solid {$this->attr['titleborder']};";<br />
}<br />
// if the attribute's value is "off", turn the border off<br />
elseif ($this->isSwitchedOff($this->attr['titleborder']) ) {<br />
$title_border='';<br />
}<br />
else {<br />
# show that the value is wrong by using a red border<br />
$title_border = "{$side}:2px solid #f00;";<br />
}<br />
<br />
<br />
// title text<br />
if (strlen($this->attr['title']) > $this->env['titlemaxlen'])<br />
$title_text = substr($this->attr['title'],0,$this->env['titlemaxlen']);<br />
else<br />
$title_text = $this->replaceCharsWithNewLine($this->attr['title']);<br />
<br />
<br />
// add that stuff to the return string<br />
$ret.= "<div style=\"{$title_width}{$title_background}{$title_color}{$title_fontfamily}".<br />
"{$title_fontsize}{$title_fontweight}{$title_textdecoration}{$title_textalign}".<br />
"{$title_padding}{$title_border}\">{$title_text}</div>";<br />
<br />
} // if title<br />
} // if frame<br />
<br />
# inner frame<br />
$ret.='<div style="'.<br />
((!$with_frame)<br />
? 'width:'.($this->objectWidth()).';'<br />
: 'width:auto;').<br />
(($this->env['patternpadding'])<br />
? "padding:{$this->env['patternpadding']};"<br />
: '').<br />
'background:'.$this->env['colorscheme'][$scheme]['bgnormal'].';">';<br />
<br />
# add identifier to the top if 'id' is not switched off.<br />
# for patterns without frame you must explicitly turn id="on"<br />
# in order to show it.<br />
if ( ( $with_frame && !$this->isSwitchedOff($this->attr['identifier']) )<br />
|| ( !$with_frame && $this->isSwitchedOn($this->attr['identifier']) ) ){<br />
$ret.=<br />
'<span style="'.<br />
'color:'.$this->env['colorscheme'][$scheme]['default'].';'.<br />
'font:' .$this->checkFontSize($this->attr['fontsize']).' '.<br />
$this->env['fontfamily'].<br />
';">'.<br />
$this->space2Nbsp($this->mod['format']).<br />
'</span><br />';<br />
}<br />
<br />
# add the pattern data itself<br />
$ret.=$this->convPattern2Html();<br />
<br />
# close inner div<br />
$ret.='</div>';<br />
<br />
// close frame<br />
if ($with_frame) $ret.='</div>';<br />
<br />
return $ret;<br />
<br />
} // private function printPattern()<br />
<br />
} // class MPTPatterns<br />
# vim: ts=4<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php&diff=654
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php
2009-02-02T21:34:19Z
<p>Cubaxd: /* MPTPatterns.settings.php */</p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.settings.php==<br />
<pre><br />
<?php<br />
###############################################################################<br />
# MPTPatterns settings<br />
# (c)opyleft 2009 cubaxd<br />
###############################################################################<br />
# Here you can configure the MPTPatterns extension, add new language defs,<br />
# new color schemes and change the standard look and behaviour.<br />
#<br />
#<br />
# NOTE: There is in most cases no data check and no error message if you enter<br />
# flawy values! So be careful.<br />
#<br />
###############################################################################<br />
<br />
function MPTPatterns_settings($mpt) {<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// I18N<br />
///<br />
<br />
# language to use<br />
$mpt->language = 'de';<br />
<br />
# The following array contains the names of the arguments<br />
# used inside the <pattern> tag.<br />
# Here you can add your language or change the names of<br />
# attributes (in case you don't like the standard names ;)<br />
# If you add another language and want to use it,<br />
# you also have to change the value of $mpt->language<br />
# to your language code.<br />
<br />
/// English<br />
<br />
# attribute names<br />
$mpt->env['attribute']['en']['format'] = 'format';<br />
$mpt->env['attribute']['en']['title'] = 'title';<br />
$mpt->env['attribute']['en']['titlebg'] = 'titlebg';<br />
$mpt->env['attribute']['en']['titlefg'] = 'titlecolor';<br />
$mpt->env['attribute']['en']['titleborder'] = 'titleborder';<br />
$mpt->env['attribute']['en']['bordercolor'] = 'bordercolor';<br />
$mpt->env['attribute']['en']['colorscheme'] = 'colorscheme';<br />
$mpt->env['attribute']['en']['identifier'] = 'id';<br />
$mpt->env['attribute']['en']['highlight'] = 'highlight';<br />
$mpt->env['attribute']['en']['width'] = 'width';<br />
$mpt->env['attribute']['en']['align'] = 'align';<br />
#$mpt->env['attribute']['en']['font'] = 'font';<br />
$mpt->env['attribute']['en']['fontsize'] = 'fontsize';<br />
$mpt->env['attribute']['en']['bold'] = 'bold';<br />
$mpt->env['attribute']['en']['frame'] = 'frame';<br />
$mpt->env['attribute']['en']['lineheight'] = 'lineheight';<br />
$mpt->env['attribute']['en']['columnwidth'] = 'columnwidth';<br />
# attribute values<br />
$mpt->env['txt']['en']['on'] = 'on';<br />
$mpt->env['txt']['en']['off'] = 'off';<br />
$mpt->env['txt']['en']['left'] = 'left';<br />
$mpt->env['txt']['en']['center'] = 'center';<br />
$mpt->env['txt']['en']['right'] = 'right';<br />
<br />
<br />
/// Deutsch<br />
<br />
# attributnamen<br />
$mpt->env['attribute']['de']['format'] = 'format';<br />
$mpt->env['attribute']['de']['title'] = 'titel';<br />
$mpt->env['attribute']['de']['titlebg'] = 'titelhintergrund';<br />
$mpt->env['attribute']['de']['titlefg'] = 'titelfarbe';<br />
$mpt->env['attribute']['de']['titleborder'] = 'titelrahmen';<br />
$mpt->env['attribute']['de']['bordercolor'] = 'rahmenfarbe';<br />
$mpt->env['attribute']['de']['colorscheme'] = 'farbschema';<br />
$mpt->env['attribute']['de']['identifier'] = 'id';<br />
$mpt->env['attribute']['de']['highlight'] = 'takt';<br />
$mpt->env['attribute']['de']['width'] = 'breite';<br />
$mpt->env['attribute']['de']['align'] = 'ausrichtung';<br />
#$mpt->env['attribute']['de']['font'] = 'schriftart';<br />
$mpt->env['attribute']['de']['fontsize'] = 'schriftgroesse';<br />
$mpt->env['attribute']['de']['bold'] = 'fett';<br />
$mpt->env['attribute']['de']['frame'] = 'rahmen';<br />
$mpt->env['attribute']['de']['lineheight'] = 'zeilenabstand';<br />
$mpt->env['attribute']['de']['columnwidth'] = 'spaltenabstand';<br />
# attributwerte<br />
$mpt->env['txt']['de']['on'] = 'an';<br />
$mpt->env['txt']['de']['off'] = 'aus';<br />
$mpt->env['txt']['de']['left'] = 'links';<br />
$mpt->env['txt']['de']['right'] = 'rechts';<br />
$mpt->env['txt']['de']['center'] = 'mitte';<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// DESIGN SETTINGS<br />
/// The values marked with ^^^ can be overridden by arguments<br />
<br />
# title<br />
$mpt->env['titlefgcol' ] = '#004'; # ^^^ - title standard color<br />
$mpt->env['titlebgcol' ] = '#aaa'; # ^^^ - title standard background<br />
$mpt->env['titlebordercol' ] = '#f00'; # ^^^ - empty string turns title border off<br />
$mpt->env['titleborderside'] = 'bottom'; # bottom, top, (right, left :-D), everything else means: all sides<br />
$mpt->env['titlemaxlen' ] = 128 ; #<br />
$mpt->env['titlefontfamily'] ='sans-serif'; #<br />
$mpt->env['titlefontsize' ] = '12px'; #<br />
$mpt->env['titlefontweight'] = 'bold'; # empty string if you want normal weight (not you, the font)<br />
$mpt->env['titledecoration'] = ''; # underline<br />
$mpt->env['titlepadding' ] = '4px'; # room between title and border<br />
$mpt->env['titletextalign' ] = 'center'; #<br />
<br />
# frame color<br />
$mpt->env['bordercol' ] = '#555'; # ^^^ - standard color of the border (empty string:off)<br />
$mpt->env['framecol' ] = '#aaa'; # small area between border and content<br />
<br />
# font<br />
$mpt->env['fontfamily' ] = 'Courier'; # standard font<br />
$mpt->env['fontsize' ] = 12 ; # ^^^ - standard fontsize<br />
$mpt->env['fontweight' ] = 'bold'; # ^^^ - bold, empty string turns bold off<br />
$mpt->env['fontsizemax' ] = 16 ; # max font size<br />
$mpt->env['fontsizemin' ] = 8 ; # min "<br />
$mpt->env['fontmeasure' ] = 'px'; # px,%,em,...<br />
<br />
# pattern column width and line height<br />
$mpt->env['patterncolwidth'] = '4px'; # ^^^ space between columns of a pattern<br />
$mpt->env['patternlnheight'] = '1.4em'; # ^^^ line height of a row in a pattern<br />
$mpt->env['patternpadding' ] = '2px'; # padding of the whole pattern area<br />
<br />
# width<br />
$mpt->env['objectwidth' ] = 'auto'; # ^^^ - standard width of the display area<br />
$mpt->env['objectmaxwidth' ] = 1200 ; # max width of the whole display area<br />
$mpt->env['objectminwidth' ] = 100 ; # min "<br />
$mpt->env['objectmeasure' ] = 'px'; #<br />
$mpt->env['objectalign' ] = 'left'; # ^^^ - standard alignment<br />
$mpt->env['objectmargin' ] = '12px'; # margin-left if float:right and vice versa<br />
$mpt->env['objectclear' ] = ''; # clear:left/right/both ... # not tested<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// BEHAVIOUR<br />
///<br />
<br />
# new line (some chars (i.e. '+') must be escaped by putting a '\' in front of them)<br />
$mpt->env['newlinechars' ] = '\+\+\+'; # add newline in title at occurrence of this string<br />
<br />
# limits<br />
$mpt->env['maxchannels' ] = 8; # limit the number of channels<br />
$mpt->env['maxrows' ] = 64; # max number of rows in a pattern<br />
<br />
$mpt->env['stdhighlight' ] = 0; # standard: highlight every 'X'th row<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// COLORSCHEMES<br />
///<br />
<br />
# The 4 OpenMPT color schemes<br />
#<br />
# You can also add your own color scheme. Just add an identifier in the<br />
# array $env['colorschemes'] right after 'BUZZ' and<br />
# set the 11 colors for it. If you for example call your scheme 'JOHN',<br />
# you have to write 11 lines like these:<br />
#<br />
# $mpt->env['colorscheme']['JOHN']['bgnormal']= '#fff';<br />
# $mpt->env['colorscheme']['JOHN']['bghighl'] = '#eee';<br />
# ...<br />
#<br />
# After this, if you use the line <pattern colorscheme="JOHN"><br />
# the pattern data is highlighted with your colors. Or, if you want to<br />
# use your scheme as standard, change the variable<br />
# $env['standardcolorscheme'] right below.<br />
$mpt->env['colorschemes'] = array(<br />
'MPT',<br />
'FT2',<br />
'IT',<br />
'BUZZ');<br />
<br />
# standard color scheme with frame (frame is standard)<br />
$mpt->env['standardcolorscheme'] = 'BUZZ';<br />
<br />
# without frame, a colorscheme with white background would fit best<br />
$mpt->env['standardcolorschemenoframe'] = 'MPT';<br />
<br />
# ColorScheme: MPT<br />
$mpt->env['colorscheme']['MPT']['bgnormal']= '#fff'; # normal background color<br />
$mpt->env['colorscheme']['MPT']['bghighl'] = '#e0e8e0'; # background of highlighted rows<br />
$mpt->env['colorscheme']['MPT']['note'] = '#000080'; # color of the note<br />
$mpt->env['colorscheme']['MPT']['instr'] = '#008080'; # color of the instrument number<br />
$mpt->env['colorscheme']['MPT']['global'] = '#800000'; # global effect commands<br />
$mpt->env['colorscheme']['MPT']['panning'] = '#008080'; # panning effects<br />
$mpt->env['colorscheme']['MPT']['volume'] = '#008000'; # volume effects<br />
$mpt->env['colorscheme']['MPT']['pitch'] = '#808000'; # pitch effects<br />
$mpt->env['colorscheme']['MPT']['other'] = '#000'; # other effects<br />
$mpt->env['colorscheme']['MPT']['default'] = '#000'; # default color<br />
$mpt->env['colorscheme']['MPT']['divider'] = '#777'; # channel divider '|'<br />
<br />
# ColorScheme: FT2<br />
$mpt->env['colorscheme']['FT2']['bgnormal']= '#000';<br />
$mpt->env['colorscheme']['FT2']['bghighl'] = '#404080';<br />
$mpt->env['colorscheme']['FT2']['note'] = '#e0e040';<br />
$mpt->env['colorscheme']['FT2']['instr'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['global'] = '#ff4040';<br />
$mpt->env['colorscheme']['FT2']['panning'] = '#0ff';<br />
$mpt->env['colorscheme']['FT2']['volume'] = '#0f0';<br />
$mpt->env['colorscheme']['FT2']['pitch'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['other'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['default'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['divider'] = '#55a';<br />
<br />
# ColorScheme: IT<br />
$mpt->env['colorscheme']['IT']['bgnormal']= '#000';<br />
$mpt->env['colorscheme']['IT']['bghighl'] = '#305830';<br />
$mpt->env['colorscheme']['IT']['note'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['instr'] = '#ff0';<br />
$mpt->env['colorscheme']['IT']['global'] = '#ff4040';<br />
$mpt->env['colorscheme']['IT']['panning'] = '#0ff';<br />
$mpt->env['colorscheme']['IT']['volume'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['pitch'] = '#ff0';<br />
$mpt->env['colorscheme']['IT']['other'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['default'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['divider'] = '#0a0';<br />
<br />
# ColorScheme: Buzz<br />
$mpt->env['colorscheme']['BUZZ']['bgnormal']= '#e1dbd0';<br />
$mpt->env['colorscheme']['BUZZ']['bghighl'] = '#d1cac0';<br />
$mpt->env['colorscheme']['BUZZ']['note'] = '#00005b';<br />
$mpt->env['colorscheme']['BUZZ']['instr'] = '#005555';<br />
$mpt->env['colorscheme']['BUZZ']['global'] = '#600';<br />
$mpt->env['colorscheme']['BUZZ']['panning'] = '#006868';<br />
$mpt->env['colorscheme']['BUZZ']['volume'] = '#005e00';<br />
$mpt->env['colorscheme']['BUZZ']['pitch'] = '#626200';<br />
$mpt->env['colorscheme']['BUZZ']['other'] = '#3a3427';<br />
$mpt->env['colorscheme']['BUZZ']['default'] = '#3a3427';<br />
$mpt->env['colorscheme']['BUZZ']['divider'] = '#996';<br />
<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// MODULE FORMATS<br />
///<br />
<br />
# This is a list of all module formats fully supported by OpenMPT<br />
# The array $env['format_long'] holds the identifier strings, which are<br />
# used when you copy/paste pattern sequences in OpenMPT's pattern editor.<br />
# One of these identifiers always appears in the first line of a<br />
# copied sequence.<br />
$mpt->env['format_long'] = array(<br />
'ModPlug Tracker IT', /* 0 */<br />
'ModPlug Tracker XM', /* 1 */<br />
'ModPlug Tracker MPT', /* 2 */<br />
'ModPlug Tracker S3M', /* 3 */<br />
'ModPlug Tracker MOD'); /* 4 */<br />
<br />
# 'format_short' is used if a user doesn't include the identifier string<br />
# along with the pattern data. In this case one should set one of these<br />
# identifiers using the "format" attribute (i.e. <pattern format="IT">).<br />
$mpt->env['format_short'] = array(<br />
'IT', /* 0 */<br />
'XM', /* 1 */<br />
'MPT', /* 2 */<br />
'S3M', /* 3 */<br />
'MOD'); /* 4 */<br />
<br />
# if no format was determined, highlight patterns as ...<br />
$mpt->env['standardformat'] = 'IT';<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// COMMAND SETS<br />
///<br />
$mpt->env['categories']=array('global','panning','volume','pitch','other');<br />
<br />
# IT Command set<br />
$mpt->env['fx']['IT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['IT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['IT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['IT'][ 'pitch' ] = 'efghou:EFGHU';<br />
$mpt->env['fx']['IT'][ 'other' ] = 'IJOQSZ\\#';<br />
<br />
# MPT Command set<br />
$mpt->env['fx']['MPT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['MPT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['MPT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['MPT'][ 'pitch' ] = 'efghou:EFGHU';<br />
$mpt->env['fx']['MPT'][ 'other' ] = 'IJOQSZ\\#';<br />
<br />
# S3M Command set<br />
$mpt->env['fx']['S3M']['global' ] = 'ABCTVW';<br />
$mpt->env['fx']['S3M']['panning'] = 'pPXY';<br />
$mpt->env['fx']['S3M']['volume' ] = 'vDKLMNR';<br />
$mpt->env['fx']['S3M']['pitch' ] = 'EFGHU';<br />
$mpt->env['fx']['S3M']['other' ] = 'IJOQSZ\\#';<br />
<br />
# XM Command set<br />
$mpt->env['fx']['XM'][ 'global' ] = 'BDFGH';<br />
$mpt->env['fx']['XM'][ 'panning'] = 'lpr8PY';<br />
$mpt->env['fx']['XM'][ 'volume' ] = 'abcdv567AC';<br />
$mpt->env['fx']['XM'][ 'pitch' ] = 'ghu1234';<br />
$mpt->env['fx']['XM'][ 'other' ] = '09EKLRTZ\\#';<br />
<br />
# MOD Command set<br />
$mpt->env['fx']['MOD']['global' ] = 'BDF';<br />
$mpt->env['fx']['MOD']['panning'] = '8';<br />
$mpt->env['fx']['MOD']['volume' ] = '567AC';<br />
$mpt->env['fx']['MOD']['pitch' ] = '1234';<br />
$mpt->env['fx']['MOD']['other' ] = '09E';<br />
<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// STATIC VALUES. NEVER CHANGE THEM!!!<br />
///<br />
$mpt->env['divider'] = '|'; # divider character<br />
$mpt->env['lennote'] = 3;<br />
$mpt->env['leninstr'] = 2;<br />
$mpt->env['lenvol'] = 3;<br />
$mpt->env['lenfx'] = 3;<br />
$mpt->env['bytesperchannel']=<br />
strlen($mpt->env['divider'])<br />
+$mpt->env['lennote']<br />
+$mpt->env['leninstr']<br />
+$mpt->env['lenvol']<br />
+$mpt->env['lenfx'];<br />
<br />
# vim: ts=4<br />
}<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php&diff=653
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php
2009-02-02T20:53:56Z
<p>Cubaxd: Die Seite wurde neu angelegt: <div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">zurück</div> ==MPTPatterns.settings.p...</p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.settings.php==<br />
<pre><br />
<?php<br />
###############################################################################<br />
# MPTPatterns settings<br />
# (c)opyleft 2009 cubaxd<br />
###############################################################################<br />
# Here you can configure the MPTPatterns extension, add new language defs,<br />
# new color schemes and change the standard look and behaviour.<br />
#<br />
#<br />
# NOTE: There is in most cases no data check and no error message if you enter<br />
# flawy values! So be careful.<br />
#<br />
###############################################################################<br />
<br />
function MPTPatterns_settings($mpt) {<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// I18N<br />
///<br />
<br />
# language to use<br />
$mpt->language = 'de';<br />
<br />
# The following array contains the names of the arguments<br />
# used inside the <pattern> tag.<br />
# Here you can add your language or change the names of<br />
# attributes (in case you don't like the standard names ;)<br />
# If you add another language and want to use it,<br />
# you also have to change the value of $mpt->language<br />
# to your language code.<br />
<br />
/// English<br />
<br />
# attribute names<br />
$mpt->env['attribute']['en']['format'] = 'format';<br />
$mpt->env['attribute']['en']['title'] = 'title';<br />
$mpt->env['attribute']['en']['titlebg'] = 'titlebg';<br />
$mpt->env['attribute']['en']['titlefg'] = 'titlecolor';<br />
$mpt->env['attribute']['en']['titleborder'] = 'titleborder';<br />
$mpt->env['attribute']['en']['bordercolor'] = 'bordercolor';<br />
$mpt->env['attribute']['en']['colorscheme'] = 'colorscheme';<br />
$mpt->env['attribute']['en']['identifier'] = 'id';<br />
$mpt->env['attribute']['en']['highlight'] = 'highlight';<br />
$mpt->env['attribute']['en']['width'] = 'width';<br />
$mpt->env['attribute']['en']['align'] = 'align';<br />
#$mpt->env['attribute']['en']['font'] = 'font';<br />
$mpt->env['attribute']['en']['fontsize'] = 'fontsize';<br />
$mpt->env['attribute']['en']['bold'] = 'bold';<br />
$mpt->env['attribute']['en']['frame'] = 'frame';<br />
$mpt->env['attribute']['en']['lineheight'] = 'lineheight';<br />
$mpt->env['attribute']['en']['columnwidth'] = 'columnwidth';<br />
# attribute values<br />
$mpt->env['txt']['en']['on'] = 'on';<br />
$mpt->env['txt']['en']['off'] = 'off';<br />
$mpt->env['txt']['en']['left'] = 'left';<br />
$mpt->env['txt']['en']['center'] = 'center';<br />
$mpt->env['txt']['en']['right'] = 'right';<br />
<br />
<br />
/// Deutsch<br />
<br />
# attributnamen<br />
$mpt->env['attribute']['de']['format'] = 'format';<br />
$mpt->env['attribute']['de']['title'] = 'titel';<br />
$mpt->env['attribute']['de']['titlebg'] = 'titelhintergrund';<br />
$mpt->env['attribute']['de']['titlefg'] = 'titelfarbe';<br />
$mpt->env['attribute']['de']['titleborder'] = 'titelrahmen';<br />
$mpt->env['attribute']['de']['bordercolor'] = 'rahmenfarbe';<br />
$mpt->env['attribute']['de']['colorscheme'] = 'farbschema';<br />
$mpt->env['attribute']['de']['identifier'] = 'id';<br />
$mpt->env['attribute']['de']['highlight'] = 'takt';<br />
$mpt->env['attribute']['de']['width'] = 'breite';<br />
$mpt->env['attribute']['de']['align'] = 'ausrichtung';<br />
#$mpt->env['attribute']['de']['font'] = 'schriftart';<br />
$mpt->env['attribute']['de']['fontsize'] = 'schriftgroesse';<br />
$mpt->env['attribute']['de']['bold'] = 'fett';<br />
$mpt->env['attribute']['de']['frame'] = 'rahmen';<br />
$mpt->env['attribute']['de']['lineheight'] = 'zeilenabstand';<br />
$mpt->env['attribute']['de']['columnwidth'] = 'spaltenabstand';<br />
# attributwerte<br />
$mpt->env['txt']['de']['on'] = 'an';<br />
$mpt->env['txt']['de']['off'] = 'aus';<br />
$mpt->env['txt']['de']['left'] = 'links';<br />
$mpt->env['txt']['de']['right'] = 'rechts';<br />
$mpt->env['txt']['de']['center'] = 'mitte';<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// DESIGN SETTINGS<br />
/// The values marked with ^^^ can be overridden by arguments<br />
<br />
# title<br />
$mpt->env['titlefgcol' ] = '#004'; # ^^^ - title standard color<br />
$mpt->env['titlebgcol' ] = '#aaa'; # ^^^ - title standard background<br />
$mpt->env['titlebordercol' ] = '#f00'; # ^^^ - empty string turns title border off<br />
$mpt->env['titleborderside'] = 'bottom'; # bottom, top, (right, left :-D), everything else means: all sides<br />
$mpt->env['titlemaxlen' ] = 128 ; #<br />
$mpt->env['titlefontfamily'] ='sans-serif'; #<br />
$mpt->env['titlefontsize' ] = '12px'; #<br />
$mpt->env['titlefontweight'] = 'bold'; # empty string if you want normal weight (not you, the font)<br />
$mpt->env['titledecoration'] = ''; # underline<br />
$mpt->env['titlepadding' ] = '4px'; # room between title and border<br />
$mpt->env['titletextalign' ] = 'center'; #<br />
<br />
# frame color<br />
$mpt->env['bordercol' ] = '#555'; # ^^^ - standard color of the border (empty string:off)<br />
$mpt->env['framecol' ] = '#aaa'; # small area between border and content<br />
<br />
# font<br />
$mpt->env['fontfamily' ] = 'Courier'; # standard font<br />
$mpt->env['fontsize' ] = 12 ; # ^^^ - standard fontsize<br />
$mpt->env['fontweight' ] = 'bold'; # ^^^ - bold, empty string turns bold off<br />
$mpt->env['fontsizemax' ] = 16 ; # max font size<br />
$mpt->env['fontsizemin' ] = 8 ; # min "<br />
$mpt->env['fontmeasure' ] = 'px'; # px,%,em,...<br />
<br />
# pattern column width and line height<br />
$mpt->env['patterncolwidth'] = '4px'; # ^^^ space between columns of a pattern<br />
$mpt->env['patternlnheight'] = '1.4em'; # ^^^ line height of a row in a pattern<br />
$mpt->env['patternpadding' ] = '2px'; # padding of the whole pattern area<br />
<br />
# width<br />
$mpt->env['objectwidth' ] = 'auto'; # ^^^ - standard width of the display area<br />
$mpt->env['objectmaxwidth' ] = 1200 ; # max width of the whole display area<br />
$mpt->env['objectminwidth' ] = 100 ; # min "<br />
$mpt->env['objectmeasure' ] = 'px'; #<br />
$mpt->env['objectalign' ] = 'left'; # ^^^ - standard alignment<br />
$mpt->env['objectmargin' ] = '12px'; # margin-left if float:right and vice versa<br />
$mpt->env['objectclear' ] = ''; # clear:left/right/both ... # not tested<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// BEHAVIOUR<br />
///<br />
<br />
# new line (some chars (i.e. '+') must be escaped by putting a '\' in front of them)<br />
$mpt->env['newlinechars' ] = '\+\+\+'; # add newline in title at occurrence of this string<br />
<br />
# limits<br />
$mpt->env['maxchannels' ] = 8; # limit the number of channels<br />
$mpt->env['maxrows' ] = 64; # max number of rows in a pattern<br />
<br />
$mpt->env['stdhighlight' ] = 0; # standard: highlight every 'X'th row<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// COLORSCHEMES<br />
///<br />
<br />
# The 4 OpenMPT color schemes<br />
#<br />
# You can also add your own color scheme. Just add an identifier in the<br />
# array $env['colorschemes'] right after 'BUZZ' and<br />
# set the 11 colors for it. If you for example call your scheme 'JOHN',<br />
# you have to write 11 lines like these:<br />
#<br />
# $mpt->env['colorscheme']['JOHN']['bgnormal']= '#fff';<br />
# $mpt->env['colorscheme']['JOHN']['bghighl'] = '#eee';<br />
# ...<br />
#<br />
# After this, if you use the line <pattern colorscheme="JOHN"><br />
# the pattern data is highlighted with your colors. Or, if you want to<br />
# use your scheme as standard, change the variable<br />
# $env['standardcolorscheme'] right below.<br />
$mpt->env['colorschemes'] = array(<br />
'MPT',<br />
'FT2',<br />
'IT',<br />
'BUZZ');<br />
<br />
# standard color scheme with frame (frame is standard)<br />
$mpt->env['standardcolorscheme'] = 'BUZZ';<br />
<br />
# without frame, a colorscheme with white background would fit best<br />
$mpt->env['standardcolorschemenoframe'] = 'MPT';<br />
<br />
# ColorScheme: MPT<br />
$mpt->env['colorscheme']['MPT']['bgnormal']= '#fff'; # normal background color<br />
$mpt->env['colorscheme']['MPT']['bghighl'] = '#e0e8e0'; # background of highlighted rows<br />
$mpt->env['colorscheme']['MPT']['note'] = '#000080'; # color of the note<br />
$mpt->env['colorscheme']['MPT']['instr'] = '#008080'; # color of the instrument number<br />
$mpt->env['colorscheme']['MPT']['global'] = '#800000'; # global effect commands<br />
$mpt->env['colorscheme']['MPT']['panning'] = '#008080'; # panning effects<br />
$mpt->env['colorscheme']['MPT']['volume'] = '#008000'; # volume effects<br />
$mpt->env['colorscheme']['MPT']['pitch'] = '#808000'; # pitch effects<br />
$mpt->env['colorscheme']['MPT']['other'] = '#000'; # other effects<br />
$mpt->env['colorscheme']['MPT']['default'] = '#000'; # default color<br />
$mpt->env['colorscheme']['MPT']['divider'] = '#777'; # channel divider '|'<br />
<br />
# ColorScheme: FT2<br />
$mpt->env['colorscheme']['FT2']['bgnormal']= '#000';<br />
$mpt->env['colorscheme']['FT2']['bghighl'] = '#404080';<br />
$mpt->env['colorscheme']['FT2']['note'] = '#e0e040';<br />
$mpt->env['colorscheme']['FT2']['instr'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['global'] = '#ff4040';<br />
$mpt->env['colorscheme']['FT2']['panning'] = '#0ff';<br />
$mpt->env['colorscheme']['FT2']['volume'] = '#0f0';<br />
$mpt->env['colorscheme']['FT2']['pitch'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['other'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['default'] = '#ff0';<br />
$mpt->env['colorscheme']['FT2']['divider'] = '#55a';<br />
<br />
# ColorScheme: IT<br />
$mpt->env['colorscheme']['IT']['bgnormal']= '#000';<br />
$mpt->env['colorscheme']['IT']['bghighl'] = '#305830';<br />
$mpt->env['colorscheme']['IT']['note'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['instr'] = '#ff0';<br />
$mpt->env['colorscheme']['IT']['global'] = '#ff4040';<br />
$mpt->env['colorscheme']['IT']['panning'] = '#0ff';<br />
$mpt->env['colorscheme']['IT']['volume'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['pitch'] = '#ff0';<br />
$mpt->env['colorscheme']['IT']['other'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['default'] = '#0f0';<br />
$mpt->env['colorscheme']['IT']['divider'] = '#0a0';<br />
<br />
# ColorScheme: Buzz<br />
$mpt->env['colorscheme']['BUZZ']['bgnormal']= '#e1dbd0';<br />
$mpt->env['colorscheme']['BUZZ']['bghighl'] = '#d1cac0';<br />
$mpt->env['colorscheme']['BUZZ']['note'] = '#00005b';<br />
$mpt->env['colorscheme']['BUZZ']['instr'] = '#005555';<br />
$mpt->env['colorscheme']['BUZZ']['global'] = '#600';<br />
$mpt->env['colorscheme']['BUZZ']['panning'] = '#006868';<br />
$mpt->env['colorscheme']['BUZZ']['volume'] = '#005e00';<br />
$mpt->env['colorscheme']['BUZZ']['pitch'] = '#626200';<br />
$mpt->env['colorscheme']['BUZZ']['other'] = '#3a3427';<br />
$mpt->env['colorscheme']['BUZZ']['default'] = '#3a3427';<br />
$mpt->env['colorscheme']['BUZZ']['divider'] = '#996';<br />
<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// MODULE FORMATS<br />
///<br />
<br />
# This is a list of all module formats fully supported by OpenMPT<br />
# The array $env['format_long'] holds the identifier strings, which are<br />
# used when you copy/paste pattern sequences in OpenMPT's pattern editor.<br />
# One of these identifiers always appears in the first line of a<br />
# copied sequence.<br />
$mpt->env['format_long'] = array(<br />
'ModPlug Tracker IT', /* 0 */<br />
'ModPlug Tracker XM', /* 1 */<br />
'ModPlug Tracker MPT', /* 2 */<br />
'ModPlug Tracker S3M', /* 3 */<br />
'ModPlug Tracker MOD'); /* 4 */<br />
<br />
# 'format_short' is used if a user doesn't include the identifier string<br />
# along with the pattern data. In this case one should set one of these<br />
# identifiers using the "format" attribute (i.e. <pattern format="IT">).<br />
$mpt->env['format_short'] = array(<br />
'IT', /* 0 */<br />
'XM', /* 1 */<br />
'MPT', /* 2 */<br />
'S3M', /* 3 */<br />
'MOD'); /* 4 */<br />
<br />
# if no format was determined, highlight patterns as ...<br />
$mpt->env['standardformat'] = 'IT';<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// COMMAND SETS<br />
///<br />
$mpt->env['categories']=array('global','panning','volume','pitch','other');<br />
<br />
# IT Command set<br />
$mpt->env['fx']['IT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['IT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['IT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['IT'][ 'pitch' ] = 'efghou:EFGHU';<br />
$mpt->env['fx']['IT'][ 'other' ] = 'IJOQSZ\\#';<br />
<br />
# MPT Command set<br />
$mpt->env['fx']['MPT'][ 'global' ] = 'ABCTVW';<br />
$mpt->env['fx']['MPT'][ 'panning'] = 'pPXY';<br />
$mpt->env['fx']['MPT'][ 'volume' ] = 'abcdvDKLMNR';<br />
$mpt->env['fx']['MPT'][ 'pitch' ] = 'efghou:EFGHU';<br />
$mpt->env['fx']['MPT'][ 'other' ] = 'IJOQSZ\\#';<br />
<br />
# S3M Command set<br />
$mpt->env['fx']['S3M']['global' ] = 'ABCTVW';<br />
$mpt->env['fx']['S3M']['panning'] = 'pPXY';<br />
$mpt->env['fx']['S3M']['volume' ] = 'vDKLMNR';<br />
$mpt->env['fx']['S3M']['pitch' ] = 'EFGHU';<br />
$mpt->env['fx']['S3M']['other' ] = 'IJOQSZ\\#';<br />
<br />
# XM Command set<br />
$mpt->env['fx']['XM'][ 'global' ] = 'BDFGH';<br />
$mpt->env['fx']['XM'][ 'panning'] = 'lpr8PY';<br />
$mpt->env['fx']['XM'][ 'volume' ] = 'abcdv567AC';<br />
$mpt->env['fx']['XM'][ 'pitch' ] = 'ghu1234';<br />
$mpt->env['fx']['XM'][ 'other' ] = '09EKLRTZ\\#';<br />
<br />
# MOD Command set<br />
$mpt->env['fx']['MOD']['global' ] = 'BDF';<br />
$mpt->env['fx']['MOD']['panning'] = '8';<br />
$mpt->env['fx']['MOD']['volume' ] = '567AC';<br />
$mpt->env['fx']['MOD']['pitch' ] = '1234';<br />
$mpt->env['fx']['MOD']['other' ] = '09E';<br />
<br />
<br />
<br />
/// ////////////////////////////////////////////////////////////////////<br />
/// STATIC VALUES. NEVER CHANGE THEM!!!<br />
///<br />
$mpt->env['divider'] = '|'; # divider character<br />
$mpt->env['lennote'] = 3;<br />
$mpt->env['leninstr'] = 2;<br />
$mpt->env['lenvol'] = 3;<br />
$mpt->env['lenfx'] = 3;<br />
$mpt->env['bytesperchannel']=<br />
strlen($mpt->env['divider'])<br />
+$mpt->env['lennote']<br />
+$mpt->env['leninstr']<br />
+$mpt->env['lenvol']<br />
+$mpt->env['lenfx'];<br />
<br />
# vim: ts=4<br />
}<br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php&diff=652
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php
2009-02-02T20:51:11Z
<p>Cubaxd: Die Seite wurde neu angelegt: <div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">zurück</div> ==MPTPatterns.class.php=...</p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.class.php==<br />
<pre><br />
<?<br />
###############################################################################<br />
# MPTPatterns class<br />
# (c)opyleft 2009 cubaxd<br />
###############################################################################<br />
<br />
class MPTPatterns {<br />
<br />
var $env=array(); // Settings<br />
var $attr=array(); // Attributes<br />
var $mod=array(); // Pattern data<br />
var $seq=array(); // Input data<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* Pattern($input, $args, $parser)<br />
*<br />
* 'main' function<br />
*/<br />
function Pattern($input, $args, $parser) {<br />
// Read attributes<br />
$this->readAttributes($args);<br />
<br />
// The pattern data splitted at the new line char<br />
$this->seq = split("\n", htmlspecialchars($input));<br />
<br />
// Determine module format<br />
$this->getFormat();<br />
<br />
// Write input data into an array for HTML conversion<br />
$this->readPattern();<br />
<br />
// Convert data to HTML<br />
return $this->printPattern();<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* readAttributes()<br />
*<br />
* Reads all attributes of the pattern tag.<br />
* If an attribute X is empty/not set, the corresponding<br />
* attr['X'] variable is set to null by the function getAttribute(),<br />
* otherwise it will be set to the attribute's value, whith<br />
* argument 2 ($option) of getAttribute() determining<br />
* how to assign the value:<br />
* 0 (null): assign value unchanged,<br />
* 1 ($numeric): assign value only if numeric<br />
* 2 ($lowercase): convert to lowercase letters<br />
* 3 ($uppercase): convert to uppercase letters<br />
* 4 ($colorcode): assign if value is valid color code<br />
*/<br />
private function readAttributes($args) {<br />
$numeric=1; $lowercase=2; $uppercase=3; $colorcode=4;<br />
<br />
$this->attr['title'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['title']], null);<br />
$this->attr['titlefg'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titlefg']], $colorcode);<br />
$this->attr['titlebg'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titlebg']], $colorcode);<br />
/* titleborder uses a color code, but can also have the value "off" */<br />
$this->attr['titleborder'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['titleborder']], null);<br />
/* bordercolor uses a color code, but can also have the value "off" */<br />
$this->attr['bordercolor'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['bordercolor']], null);<br />
$this->attr['width'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['width']], $numeric);<br />
$this->attr['format'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['format']], $uppercase);<br />
$this->attr['identifier'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['identifier']], $lowercase);<br />
$this->attr['highlight'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['highlight']], $numeric);<br />
$this->attr['fontsize'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['fontsize']], null);<br />
$this->attr['bold'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['bold']], $lowercase);<br />
$this->attr['frame'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['frame']], $lowercase);<br />
$this->attr['align'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['align']], $lowercase);<br />
$this->attr['colorscheme'] = $this->getColorScheme(<br />
$args[$this->env['attribute'][$this->language]['colorscheme']]);<br />
$this->attr['lineheight'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['lineheight']], null);<br />
$this->attr['columnwidth'] = $this->getAttribute(<br />
$args[$this->env['attribute'][$this->language]['columnwidth']], null);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getAttribute($val, $option)<br />
*<br />
* Checks an attribute of the pattern tag, converts its value if needed<br />
* and returns the data<br />
*<br />
* @param any $val<br />
* value of the given attribute<br />
* @param integer $option<br />
* 0: off<br />
* 1: check if numeric<br />
* 2: return value in lowercase letters<br />
* 3: return value in uppercase letters<br />
* 4: check for color code (#RR?GG?BB?)<br />
*/<br />
private function getAttribute($val, $option=null) {<br />
$numeric=1; $lowercase=2; $uppercase=3; $colorcode=4;<br />
if (isset($val)) {<br />
<br />
switch ($option) {<br />
<br />
case $numeric:<br />
return ( is_numeric($val) ) ? $val : null;<br />
break;<br />
<br />
case $lowercase:<br />
return strtolower(htmlspecialchars($val));<br />
break;<br />
<br />
case $uppercase:<br />
return strtoupper(htmlspecialchars($val));<br />
break;<br />
<br />
case $colorcode:<br />
return $this->isValidColor($val);<br />
break;<br />
<br />
}<br />
return htmlspecialchars($val);<br />
}<br />
// Attribute not set<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getColorScheme()<br />
*<br />
* Read attribute 'colorscheme' and test if the parameter is valid.<br />
* If not, the standardscheme is used. If this isn't valid either,<br />
* we gonna use the first scheme in the 'colorschemes' list.<br />
*/<br />
private function getColorScheme($arg) {<br />
<br />
if (isset($arg) )<br />
$scheme = strtoupper(htmlspecialchars($arg));<br />
elseif (!$this->isSwitchedOff($this->attr['frame'] ) )<br />
$scheme = strtoupper($this->env['standardcolorscheme']);<br />
else<br />
$scheme = strtoupper($this->env['standardcolorschemenoframe']);<br />
<br />
for ($i=0; $i<count($this->env['colorschemes']); $i++) {<br />
if ($this->env['colorschemes'][$i]==$scheme) {<br />
# set scheme for later use<br />
$this->mod['scheme'] = $scheme;<br />
$this->attr['colorscheme'] = $scheme;<br />
return $scheme;<br />
}<br />
}<br />
<br />
// if the 'standardcolorscheme' is invalid, use the first entry<br />
return $this->env['colorschemes'][0];<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isValidColor()<br />
*<br />
* Checks, if a color code is valid. Valid params are only #RrGgBb or #RGB.<br />
* If the check was successful, the color is returned, otherwise null.<br />
*/<br />
private function isValidColor($col) {<br />
if (preg_match("/^#[0-9A-Fa-f]{3}$/", $col) == 0)<br />
if (preg_match("/^#[0-9A-Fa-f]{6}$/", $col) == 0)<br />
return null;<br />
<br />
return $col;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* objectWidth()<br />
*<br />
* Compares the width with the min and max width values and returns<br />
* it modified if needed. If the width is numeric, that is, not 'auto',<br />
* the measure (defined in the settings file) is added.<br />
* If the with is 200 and measure is 'px', then '200px' is returned<br />
*<br />
*/<br />
private function objectWidth() {<br />
// check if standard width is a valid parameter and set to 'auto' if not<br />
if (!is_numeric($this->env['objectwidth']) || $this->env['objectwidth']!='auto' )<br />
$this->env['objectwidth']='auto';<br />
<br />
// width attribute not set. use standard width<br />
if (is_null($this->attr['width']))<br />
$ret = $this->env['objectwidth'];<br />
<br />
// check min and max width<br />
if ($this->attr['width'] > $this->attr['objectmaxwidth'])<br />
$ret = $this->env['objectmaxwidth'];<br />
if ($this->attr['width'] < $this->attr['objectminwidth'] )<br />
$ret = $this->env['objectminwidth'];<br />
<br />
// width parameter okay<br />
if (is_numeric($ret))<br />
return $ret.$this->env['objectmeasure'];<br />
<br />
return $ret;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getFormat()<br />
*<br />
* Search for identifier string in pattern, or if the search was<br />
* unsuccessful, try to read the 'format' attribute.<br />
* This is neccessary as we must know which effect commands to highlight<br />
* in which color. If the format was not determined, the standard format<br />
* will be used, which defaults to the Impulse Tracker format, but can be<br />
* changed in the settings to any other format in the list.<br />
*<br />
* $attr['format'] will contain the short identifier (i.e: "S3M"), and<br />
* $mod['format'] the long one ("ModPlug Tracker S3M")<br />
*/<br />
private function getFormat() {<br />
// try to read Identifier string<br />
// (which usually begins with "ModPlug Tracker ")<br />
for ($i=0; $i<count($this->seq); $i++) {<br />
<br />
// compare current $input line with ID strings<br />
for ($j=0; $j<count($this->env['format_long']); $j++)<br />
if ($this->seq[$i] == $this->env['format_long'][$j])<br />
$this->mod['format']=$this->env['format_long'][$j];<br />
<br />
// Identifier found, we can abort the loop now<br />
if ($this->mod['format'])<br />
break;<br />
<br />
// as soon as the first '|' character appears, it is unlikely for<br />
// the identifier string to appear since it is usually at the top<br />
// of the copied pattern.<br />
if (substr($this->seq[$i], 0, 1) == $this->env['divider'])<br />
break;<br />
}<br />
<br />
// ... the identifier string couldn't be found in the pattern.<br />
// Let's try it via the format attribute of the <pattern> tag<br />
if (!$this->mod['format']) {<br />
<br />
// Look if the "format" attribute is set.<br />
if (!is_null($this->attr['format']) && $this->attr['format']>'') {<br />
<br />
// compare the attribute value with all ID strings<br />
for ($i=0; $i<count($this->env['format_long']); $i++) {<br />
<br />
// format string valid<br />
if ($this->attr['format'] == $this->env['format_short'][$i]) {<br />
<br />
// assign<br />
$this->mod['format']=$this->env['format_long'][$i];<br />
}<br />
}<br />
}<br />
// neither identifier string found, nor format attribute set<br />
// We're going to use the standard format in this case<br />
else<br />
$this->mod['format'] = $this->getLongIdentifier($this->env['standardformat']);<br />
<br />
}<br />
// set the short name of the identifier<br />
$this->attr['format'] = $this->getShortIdentifier($this->mod['format']);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getLongIdentifier()<br />
* returns the long ID of a short one<br />
* (i.e. "IT" --> "ModPlug Tracker IT" )<br />
*/<br />
private function getLongIdentifier($short) {<br />
for ($i=0; $i<$this->env['format_short']; $i++)<br />
if ($short == $this->env['format_short'][$i])<br />
return $this->env['format_long'][$i];<br />
<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getShortIdentifier()<br />
*<br />
* the opposite of getLongIdentifier()<br />
*/<br />
private function getShortIdentifier($long) {<br />
for ($i=0; $i<$this->env['format_long']; $i++)<br />
if ($long == $this->env['format_long'][$i])<br />
return $this->env['format_short'][$i];<br />
<br />
return null;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getLineHeight()<br />
*<br />
* If lineheight argument is not set, the standard value will be used<br />
*/<br />
private function getLineHeight() {<br />
if (isset($this->attr['lineheight']) && strlen($this->attr['lineheight'])<=6) {<br />
if (is_numeric($this->attr['lineheight'])) {<br />
// if unit was not specified, use 'px'<br />
return $this->attr['lineheight'].'px';<br />
}<br />
return $this->attr['lineheight'];<br />
}<br />
return $this->env['patternlnheight'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getColumnWidth()<br />
*<br />
*If colwidth argument is not set, the standard value will be used<br />
*/<br />
private function getColumnWidth() {<br />
if (isset($this->attr['columnwidth']) && strlen($this->attr['columnwidth'])<=6) {<br />
if (is_numeric($this->attr['lineheight'])) {<br />
// if unit was not specified, use 'px'<br />
return $this->attr['columnwidth'].'px';<br />
}<br />
return $this->attr['columnwidth'];<br />
}<br />
return $this->env['patterncolwidth'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* checkFontSize($arg)<br />
*<br />
* Test if attribute fontsize was set and check for the allowed range<br />
* The fontsize is returned together with the size measure unit.<br />
* For example, if the size is 12, and the unit px, then 12px is returned.<br />
* The measure and the min and max font size can be changed in the<br />
* settings file.<br />
*/<br />
private function checkFontSize($arg)<br />
{<br />
if (!is_null($arg) ) {<br />
if (is_numeric($arg) ) {<br />
// font size smaller than minimum allowed size?<br />
if ($arg<$this->env['fontsizemin']) {<br />
if (is_numeric($this->env['fontsizemin']))<br />
return $this->env['fontsizemin'].$this->env['fontmeasure'];<br />
else<br />
// if the fontsize in the settings is not numeric<br />
// return this standard size<br />
return "12px";<br />
}<br />
// font size greater than max allowed size?<br />
elseif ($arg>$this->env['fontsizemax']) {<br />
if (is_numeric($this->env['fontsizemax']))<br />
return $this->env['fontsizemax'].$this->env['fontmeasure'];<br />
else<br />
return "12px";<br />
}<br />
else<br />
return $arg.$this->env['fontmeasure'];<br />
<br />
# XXX a size parameter with measure would make the<br />
# XXX fontsize limit settings useless<br />
# }<br />
# else {<br />
# // fontsize parameter is not numeric. Maybe it is a<br />
# // number with a unit 'suffix'?<br />
# if (preg_match('/^[0-9]{1,2}px$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{0,1}.?[0-9]{0,2}em$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{1,4}%$/', $arg) )<br />
#<br />
# if (preg_match('/^[0-9]{1,2}pt$/', $arg) )<br />
#<br />
<br />
}<br />
} # !is_null<br />
return $this->env['fontsize'].$this->env['fontmeasure'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isSwitchedOff($val)<br />
*<br />
* returns true if an attribute's value is 'off'<br />
*/<br />
private function isSwitchedOff($val) {<br />
if ($val == $this->env['txt'][$this->language]['off'])<br />
return true;<br />
return false;<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* isSwitchedOn($val)<br />
*<br />
* returns true if an attribute's value is 'on'<br />
*/<br />
private function isSwitchedOn($val) {<br />
if ($val == $this->env['txt'][$this->language]['on'])<br />
return true;<br />
return false;<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* getEffectColor($eff)<br />
*<br />
* returns the color for a particular effect<br />
*/<br />
private function getEffectColor($eff) {<br />
<br />
for ($i=0; $i<count($this->env['categories']); $i++)<br />
if (preg_match("/".substr($eff,0,1)."/",<br />
$this->env['fx'][$this->attr['format']][$this->env['categories'][$i]] ) )<br />
return $this->env['colorscheme'][$this->attr['colorscheme']][$this->env['categories'][$i]];<br />
<br />
// Couldn't find effect - use default color<br />
return $this->env['colorscheme'][$this->attr['colorscheme']]['default'];<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* setLink($eff)<br />
*<br />
* add MediaWiki link to an effect<br />
*/<br />
/* NOT YET IMPLEMENTED<br />
private function setLink($eff, &$parser) {<br />
$category = array ('global','panning','volume','pitch','other');<br />
<br />
<br />
if ($seite>'')<br />
return $parser->recursiveTagParse("[[$seite|$eff]]");<br />
else<br />
return $eff;<br />
}<br />
*/<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* addCSSData()<br />
*<br />
* fills the spanTag() with style data<br />
*/<br />
private function addCssData(<br />
$dat, /* the text itself */<br />
$css_color, /* color */<br />
$css_font, /* font */<br />
$css_fontweight, /* font-weight */<br />
$css_fontsize, /* font-size */<br />
$css_padding_left, /* padding-left */<br />
$css_padding_right, /* padding-right */<br />
$css_line_height, /* line-height */<br />
$css_background='' /* background */<br />
)<br />
{<br />
return $this->spanTag( $dat,<br />
"color:$css_color;".<br />
(!is_null( $css_font )<br />
? "font-family:$css_font;" : '').<br />
(!is_null( $css_fontweight )<br />
? "font-weight:$css_fontweight;" : '').<br />
(!is_null( $css_fontsize )<br />
? "font-size:$css_fontsize;" : '').<br />
(!is_null( $css_padding_left )<br />
? "padding-left:$css_padding_left;" : '').<br />
(!is_null( $css_padding_right )<br />
? "padding-right:$css_padding_right;" : '').<br />
(!is_null( $css_line_height )<br />
? "line-height:$css_line_height;" : '').<br />
(!is_null( $css_background )<br />
? "background:$css_background;" : '')<br />
);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* spanTag()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
private function spanTag($dat, $style) {<br />
return '<span style="line-height:'.$this->env['patternlnheight'].';'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* space2Nbsp($str)<br />
*<br />
* returns string $str with the first of two successive space characters<br />
* converted to a non-breaking space.<br />
*/<br />
private function space2Nbsp($str) {<br />
return preg_replace('/ /', "\x26nbsp; ", $str);<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* setAlignment()<br />
*<br />
* checks the align attribute's parameter and returns CSS data depending<br />
* on whether the alignment was left, center, or right<br />
*/<br />
private function setAlignment() {<br />
<br />
# i18n<br />
$left = $this->env['txt'][$this->language]['left'];<br />
$center = $this->env['txt'][$this->language]['center'];<br />
$right = $this->env['txt'][$this->language]['right'];<br />
<br />
$clear = (($this->env['objectclear']>'')<br />
? "clear:{$this->env['objectclear']};"<br />
: '');<br />
<br />
# check, if settings are correct. If not, use 'left'<br />
if ($this->env['objectalign']!='left'<br />
&& $this->env['objectalign']!='center'<br />
&& $this->env['objectalign']!='right'<br />
)<br />
$this->env['objectalign']='left';<br />
<br />
# if attribute align doesn't have a valid value, use the standard<br />
if ( is_null($this->attr['align'])<br />
|| ($this->attr['align']!=$left<br />
&& $this->attr['align']!=$center<br />
&& $this->attr['align']!=$right)<br />
)<br />
$this->attr['align']=<br />
$this->env['txt'][$this->language][$this->env['objectalign']];<br />
<br />
if ($this->attr['align']==$left)<br />
return "float:left;margin-right:{$this->env['objectmargin']};$clear";<br />
<br />
if ($this->attr['align']==$right)<br />
return "float:right;margin-left:{$this->env['objectmargin']};$clear";<br />
<br />
return "$clear";<br />
}<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* replaceCharsWithNewLine()<br />
*<br />
* replace $env['newlinechars'] (see settings) by new line in $txt<br />
*/<br />
private function replaceCharsWithNewLine($txt) {<br />
if ($this->env['newlinechars']>'')<br />
$pattern = "/{$this->env['newlinechars']}/";<br />
else<br />
// no newlinechars specified - return string unmodified<br />
return $txt;<br />
<br />
if (preg_match($pattern, $txt ) )<br />
return preg_replace($pattern, "<br />", $txt);<br />
<br />
// no newlinechars found, return unmodified<br />
return $txt;<br />
}<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* readPattern()<br />
*<br />
* writes the pattern data into an array<br />
*/<br />
private function readPattern() {<br />
// Read every line<br />
// $zeile ist a line in the input array $this->seq<br />
// $row is a line in the output array $mod['dat']<br />
$row=0;<br />
for ($zeile=0; $zeile<count($this->seq); $zeile++) {<br />
// Lines shorter than 12 chars and/or lines not beginning with `|'<br />
// are ignored<br />
<br />
# limit rows<br />
if ($row>=$this->env['maxrows'])<br />
break;<br />
<br />
if ( (strlen($this->seq[$zeile]) >= $this->env['bytesperchannel'] )<br />
&& (substr($this->seq[$zeile], 0, 1) == $this->env['divider']) )<br />
{<br />
// each channel consists of 'bytesperchannel' bytes<br />
for ($pos=0, $channel=0;<br />
$pos<strlen($this->seq[$zeile]);<br />
$pos+=$this->env['bytesperchannel'], $channel++)<br />
{<br />
# limit the number of channels<br />
if ($channel>=$this->env['maxchannels'])<br />
break;<br />
<br />
// Check if a channel's first byte is the divider char ('|'),<br />
// This way we avoid having nonsense in the output array.<br />
if (substr($this->seq[$zeile], $pos, strlen($this->env['divider']))<br />
== $this->env['divider'])<br />
{<br />
$p=strlen($this->env['divider']);<br />
<br />
# Note (3 chars: 1-3 (first char is 0))<br />
$this->mod['dat'][$row][$channel]['note']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['lennote']);<br />
<br />
$p+=$this->env['lennote'];<br />
# Instrument (2 chars: 4-5)<br />
$this->mod['dat'][$row][$channel]['instr']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['leninstr']);<br />
<br />
$p+=$this->env['leninstr'];<br />
# Volume (3 chars: 6-8)<br />
$this->mod['dat'][$row][$channel]['vol']<br />
= substr($this->seq[$zeile], $pos+$p, $this->env['lenvol']);<br />
<br />
$p+=$this->env['lenvol'];<br />
# Effect (3 chars: 9-11)<br />
// if there is an effect without param, convert '..' to '00'<br />
$this->mod['dat'][$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\#])\.\.', '\100',<br />
substr($this->seq[$zeile], $pos+$p, $this->env['lenfx']));<br />
<br />
}<br />
}<br />
// $row is the index of the output array. If we would use $zeile<br />
// as its index, every empty or invalid entry of the input array<br />
// would increase the counter and thus give us "false positives"<br />
$row++;<br />
}<br />
}<br />
}<br />
<br />
<br />
<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* convPattern2Html()<br />
*<br />
* converts the pattern data to html<br />
*/<br />
private function convPattern2Html() {<br />
$ret=null;<br />
$scheme = $this->getColorscheme($this->attr['colorscheme']);<br />
<br />
<br />
// use standard highlight, if attribute highlight was not specified<br />
if ($this->attr['highlight']===null)<br />
$this->attr['highlight']=$this->env['stdhighlight'];<br />
<br />
<br />
// merge data array<br />
for ($row=0; $row<count($this->mod['dat']); $row++) {<br />
for ($channel=0; $channel<count($this->mod['dat'][$row]); $channel++) {<br />
<br />
// Attribute highlight="X": Highlight every Xth line<br />
if ($this->attr['highlight']>0)<br />
$background = ($row % $this->attr['highlight']==0)<br />
? $this->env['colorscheme'][$scheme]['bghighl'] : '';<br />
<br />
// some shortcuts<br />
$note = $this->mod['dat'][$row][$channel]['note'];<br />
$instr= $this->mod['dat'][$row][$channel]['instr'];<br />
$vol = $this->mod['dat'][$row][$channel]['vol'];<br />
$eff = $this->mod['dat'][$row][$channel]['eff'];<br />
<br />
# Divider<br />
$ret.= $this->addCssData(<br />
/* data */ $this->env['divider'],<br />
/* color */ $this->env['colorscheme'][$scheme]['divider'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ null,<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ null, #$this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Note<br />
$ret.= $this->addCssData(<br />
/* data */ $note,<br />
/* color */ (substr($note,0,1) == '.' )<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->env['colorscheme'][$scheme]['note'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Instrument<br />
$ret.= $this->addCssData(<br />
/* data */ $instr,<br />
/* color */ (substr($instr,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->env['colorscheme'][$scheme]['instr'],<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Volume Column<br />
$ret.= $this->addCssData(<br />
/* data */ $vol,<br />
/* color */ (substr($vol,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->getEffectColor($vol),<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
# Effect Column<br />
$ret.= $this->addCssData(<br />
/* data */ $eff,<br />
/* color */ (substr($eff,0,1) == '.')<br />
/* */ ? $this->env['colorscheme'][$scheme]['default']<br />
/* */ : $this->getEffectColor($eff),<br />
/* font */ $this->env['fontfamily'],<br />
/* f-weight */ ($this->isSwitchedOff($this->attr['bold'])<br />
/* */ ? null<br />
/* */ : $this->env['fontweight']),<br />
/* f-size */ $this->checkFontSize($this->attr['fontsize']),<br />
/* pad-left */ null,<br />
/* pad-rght */ $this->getColumnWidth(),<br />
/* ln-height*/ $this->getLineHeight(),<br />
/* backgr */ $background);<br />
<br />
}<br />
$ret.="<br />";<br />
} # for ($row ...<br />
return $ret;<br />
}<br />
<br />
private function getBorderSide($arg) {<br />
switch ($arg) {<br />
case 'top': return 'border-top';<br />
case 'right': return 'border-right';<br />
case 'bottom': return 'border-bottom';<br />
case 'left': return 'border-left';<br />
default: return 'border';<br />
}<br />
}<br />
<br />
/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br />
* printPattern()<br />
*<br />
*<br />
*/<br />
private function printPattern() {<br />
$ret = '';<br />
<br />
# only add frame if it is not turned off<br />
$with_frame = ($this->isSwitchedOff($this->attr['frame'])) ? false : true;<br />
# a title is only added if the pattern has a frame<br />
$with_title = (is_null($this->attr['title']) || $this->attr['title']=='') ? false : true;<br />
<br />
$scheme = $this->mod['scheme'];<br />
<br />
// open div. this can be turned off by using attribute 'frame="off"'<br />
if ($with_frame) {<br />
<br />
$frame_width = "width:".($this->objectWidth()).";";<br />
<br />
// frame border: if not specified, the border is turned off<br />
if (is_null($this->attr['bordercolor'])) {<br />
if ($this->env['bordercol']>'') {<br />
// use standard color, defined in the settings file<br />
if ($this->isValidColor($this->env['bordercol']))<br />
$frame_border = "border:1px solid {$this->env['bordercol']};";<br />
// standard color wrong, use to show there is an err<br />
else<br />
$frame_border = "border:2px solid #f00;";<br />
}<br />
else<br />
$frame_border = '';<br />
}<br />
elseif ($this->isValidColor($this->attr['bordercolor']))<br />
$frame_border = "border:1px solid {$this->attr['bordercolor']};";<br />
elseif ($this->isSwitchedOff($this->attr['bordercolor']))<br />
$frame_border='';<br />
else {<br />
# show that value is wrong by using a red border<br />
$frame_border = 'border:2px solid #f00;';<br />
}<br />
<br />
$frame_padding = "padding:1px:";<br />
<br />
if ($this->isValidColor($this->env['framecol']))<br />
$frame_bg = "background:{$this->env['framecol']};";<br />
else<br />
$frame_bg = '';<br />
<br />
$frame_align = $this->setAlignment();<br />
<br />
$ret.="<div style=\"$frame_width$frame_border$frame_padding$frame_bg$frame_align\">";<br />
<br />
// add title div<br />
// this is a long list of conditions, because<br />
// style elements are only added if they are set.<br />
if ($with_title) {<br />
<br />
$title_width = "width:auto;";<br />
<br />
// background:<br />
if (is_null($this->attr['titlebg']))<br />
if ($this->isValidColor($this->env['titlebgcol'])!=null)<br />
$title_background = "background:{$this->env['titlebgcol']};";<br />
else<br />
$title_background = "background:#ccc;";<br />
else<br />
$title_background = "background:{$this->attr['titlebg']};";<br />
<br />
// color:<br />
if (is_null($this->attr['titlefg']))<br />
if ($this->isValidColor($this->env['titlefgcol'])!=null)<br />
$title_color = "color:{$this->env['titlefgcol']};";<br />
else<br />
$title_color = "color:#000;";<br />
else<br />
$title_color = "color:{$this->attr['titlefg']};";<br />
<br />
// font-family:<br />
if ( $this->env['titlefontfamily'] > '')<br />
$title_fontfamily = "font-family:{$this->env['titlefontfamily']};";<br />
else<br />
$title_fontfamily = '';<br />
<br />
// font-size:<br />
if ($this->env['titlefontsize'] > '')<br />
$title_fontsize = "font-size:{$this->env['titlefontsize']};";<br />
else<br />
$title_fontsize = '';<br />
<br />
// font-weight<br />
if ($this->env['titlefontweight'] > '')<br />
$title_fontweight = "font-weight:{$this->env['titlefontweight']};";<br />
else<br />
$title_fontweight = '';<br />
<br />
// text-decoration<br />
if ($this->env['titledecoration'] > '')<br />
$title_textdecoration = "text-decoration:{$this->env['titledecoration']};";<br />
else<br />
$title_textdecoration = '';<br />
<br />
// text-align:<br />
if ($this->env['titletextalign'] > '')<br />
$title_textalign = "text-align:{$this->env['titletextalign']};";<br />
else<br />
$title_textalign = "text-align:center;";<br />
<br />
// padding:<br />
if ($this->env['titlepadding'] > '')<br />
$title_padding = "padding:{$this->env['titlepadding']};";<br />
else<br />
$title_padding = '';<br />
<br />
// border: if not specified, the border is turned off<br />
$side = $this->getBorderSide($this->env['titleborderside']);<br />
if (is_null($this->attr['titleborder'])) {<br />
if ($this->env['titlebordercol']>'') {<br />
// use standard color, defined in the settings file<br />
if ($this->isValidColor($this->env['titlebordercol'])) {<br />
$title_border = "{$side}:".<br />
"1px solid {$this->env['titlebordercol']};";<br />
}<br />
// standard color wrong, use red to show there is an err<br />
else {<br />
$title_border = "{$side}:2px solid #f00;";<br />
}<br />
}<br />
else<br />
$title_border = '';<br />
}<br />
// use colorcode specified using the attribute titleborder<br />
elseif ($this->isValidColor($this->attr['titleborder'])) {<br />
$title_border = "{$side}:".<br />
"1px solid {$this->attr['titleborder']};";<br />
}<br />
// if the attribute's value is "off", turn the border off<br />
elseif ($this->isSwitchedOff($this->attr['titleborder']) ) {<br />
$title_border='';<br />
}<br />
else {<br />
# show that the value is wrong by using a red border<br />
$title_border = "{$side}:2px solid #f00;";<br />
}<br />
<br />
<br />
// title text<br />
if (strlen($this->attr['title']) > $this->env['titlemaxlen'])<br />
$title_text = substr($this->attr['title'],0,$this->env['titlemaxlen']);<br />
else<br />
$title_text = $this->replaceCharsWithNewLine($this->attr['title']);<br />
<br />
<br />
// add that stuff to the return string<br />
$ret.= "<div style=\"{$title_width}{$title_background}{$title_color}{$title_fontfamily}".<br />
"{$title_fontsize}{$title_fontweight}{$title_textdecoration}{$title_textalign}".<br />
"{$title_padding}{$title_border}\">{$title_text}</div>";<br />
<br />
} // if title<br />
} // if frame<br />
<br />
# inner frame<br />
$ret.='<div style="'.<br />
((!$with_frame)<br />
? 'width:'.($this->objectWidth()).';'<br />
: 'width:auto;').<br />
(($this->env['patternpadding'])<br />
? "padding:{$this->env['patternpadding']};"<br />
: '').<br />
'background:'.$this->env['colorscheme'][$scheme]['bgnormal'].';">';<br />
<br />
# add identifier to the top if 'id' is not switched off.<br />
# for patterns without frame you must explicitly turn id="on"<br />
# in order to show it.<br />
if ( ( $with_frame && !$this->isSwitchedOff($this->attr['identifier']) )<br />
|| ( !$with_frame && $this->isSwitchedOn($this->attr['identifier']) ) ){<br />
$ret.=<br />
'<span style="'.<br />
'color:'.$this->env['colorscheme'][$scheme]['default'].';'.<br />
'font:' .$this->checkFontSize($this->attr['fontsize']).' '.<br />
$this->env['fontfamily'].<br />
';">'.<br />
$this->space2Nbsp($this->mod['format']).<br />
'</span><br />';<br />
}<br />
<br />
# add the pattern data itself<br />
$ret.=$this->convPattern2Html();<br />
<br />
# close inner div<br />
$ret.='</div>';<br />
<br />
// close frame<br />
if ($with_frame) $ret.='</div>';<br />
<br />
return $ret;<br />
<br />
} // private function printPattern()<br />
<br />
} // class MPTPatterns<br />
# vim: ts=4<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.php&diff=651
OpenMPT-Wiki:Werkstatt/MPTPatterns/MPTPatterns.php
2009-02-02T20:49:37Z
<p>Cubaxd: Die Seite wurde neu angelegt: <div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">zurück</div> ==MPTPatterns.php== <pre...</p>
<hr />
<div><div style="border:1px solid #aaa;background:#eee;padding:4px;width:6em;text-align:center">[[OpenMPT Wiki:Werkstatt/MPTPatterns|zurück]]</div><br />
==MPTPatterns.php==<br />
<pre><br />
<?php<br />
###############################################################################<br />
# MPTPatterns<br />
# (c)opyleft 2009 cubaxd <cubaxd 0x40 yahoo 0x2e de><br />
#<br />
# A MediaWiki extension which displays and highlights OpenMPT patterns.<br />
# Written for the German OpenMPT Wiki (http://sagamusix.de/openmpt/).<br />
#<br />
# URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
#<br />
# OpenMPT (formerly known as ModPlug Tracker)<br />
# is a music tracker program for Microsoft Windows. See http://modplug.com/<br />
#<br />
# Version: 0.4b<br />
#<br />
###############################################################################<br />
# License: GNU General Public License v3<br />
#<br />
# This program is free software: you can redistribute it and/or modify<br />
# it under the terms of the GNU General Public License as published by<br />
# the Free Software Foundation, either version 3 of the License, or<br />
# (at your option) any later version.<br />
#<br />
# This program is distributed in the hope that it will be useful,<br />
# but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br />
# GNU General Public License for more details.<br />
#<br />
# // You should have received a copy of the GNU General Public License<br />
# // along with this program. If not, see http://www.gnu.org/licenses/<br />
#<br />
# Read The License text here: http://www.gnu.org/licenses/gpl.txt<br />
#<br />
###############################################################################<br />
# Changelog:<br />
#<br />
# 0.1b erster Versuch<br />
# 0.2b erste brauchbare Version<br />
# 0.3b - Farbschemen hinzugefügt. Attribut farbe="MPT|FT2|IT|BUZZ (Standard)"<br />
# - Attribut schriftgroesse - mögliche Werte: 8-16<br />
# - Attribut fett - "nein" oder "aus" schaltet fettschrift ab<br />
# - Effektbefehle '\' und '#' beim IT-Format vergessen<br />
# - MPTM und IT wurden nicht getrennt behandelt<br />
# - Attribute titelvg, titelhg, titelrahmen und rahmenfarbe zum<br />
# einstellen der Farben<br />
# 0.3.1b - Attribut breite<br />
# 0.4b - große Teile neu geschrieben<br />
# - i18n<br />
# - Rahmen kann jetzt ganz ausgeschaltet werden rahmen="aus"<br />
#<br />
###############################################################################<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if (!defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die(-1);<br />
}<br />
<br />
$wgAutoloadClasses['MPTPatterns'] = dirname( __FILE__ ) . '/MPTPatterns.class.php';<br />
<br />
//Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980<br />
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {<br />
$wgHooks['ParserFirstCallInit'][] = 'efMPTPatterns';<br />
} else { // Otherwise do things the old fashioned way<br />
$wgExtensionFunctions[] = 'efMPTPatterns';<br />
}<br />
<br />
function efMPTPatterns() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPTPatterns_Init');<br />
return true;<br />
}<br />
<br />
// Initialisierungsfunktion<br />
function MPTPatterns_Init( $input, $args, &$parser) {<br />
// error_reporting(E_ALL);<br />
require_once(dirname(__FILE__).'/MPTPatterns.settings.php');<br />
$mpt = new MPTPatterns;<br />
MPTPatterns_settings($mpt);<br />
return $mpt->Pattern( $input, $args, $parser);<br />
}<br />
<br />
# vim: ts=4<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=650
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-02-02T20:45:49Z
<p>Cubaxd: </p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese MediaWiki-Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns. Sie wurde speziell für das deutsche OpenMPT Wiki geschrieben, kann aber auch überall sonst verwendet werden.<br />
<br />
{{Hinweis|Anmerkung|Nachdem das Programm langsam Form angenommen hat, habe ich große Teile des Codes neu geschrieben und neu strukturiert. Die Erweiterung ist jetzt leichter zu konfigurieren und enthält wahrscheinlich auch zehnmal so viele Bugs wie die Vorgängerversion. Kann sein, dass noch einige Bugfixes nachkommen. Die Sache mit dem Einbinden von CSS außerhalb der span-Tags habe ich immer noch nicht geregelt bekommen :-D. Naja, mal sehen. Habe den Code erstmal nur zwecks Fehlersuche hochgeladen. Kommentare sind in gebrochenem Englisch geschrieben, weil die Erweiterung jetzt auf Mehrsprachigkeit ausgelegt ist (hatte Langeweile ;)). }}<br />
<br />
== Bekannte und mögliche Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Durch das Hinzufügen von drei Pluszeichen an der Stelle, wo ein Zeilenumbruch hinzugefügt werden soll, kann das derzeit umgangen werden. <br />
<br />
* Eventuelle Probleme mit der Darstellung in einigen Browsern/Browserversionen<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich und auch wahrscheinlich, dass der Code Bugs enthält.<br />
<br />
== Installation ==<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen<br />
* Die folgenden Dateien in <code>extensions/MPTPatterns</code> speichern:<br />
** <code>[[OpenMPT Wiki:Werkstatt/MPTPatterns/MPTPatterns.php|MPTPatterns.php]]</code><br />
** <code>[[OpenMPT Wiki:Werkstatt/MPTPatterns/MPTPatterns.class.php|MPTPatterns.class.php]]</code><br />
** <code>[[OpenMPT Wiki:Werkstatt/MPTPatterns/MPTPatterns.settings.php|MPTPatterns.settings.php]]</code><br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Dies ist nur ein Beispiel für die Benutzung. Die Erweiterung enthält einige [[#Attribute|Attribute]], durch die sich die Darstellung beeinflussen lässt. Des weiteren lässt sich über die Settings-Datei das Programm bis ins Detail anpassen, ohne den Quellcode direkt manipulieren zu müssen (was allerdings dem Admin vorbehalten ist).<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
== Attribute ==<br />
<br />
Alle Werte von Attributen außer natürlich ''titel'' und die Attribute mit numerischen Parametern (X) sind case-insensitive.<br />
<br />
* '''id'''="''aus''": Der ID-String wird nicht angezeigt<br />
* '''format'''="''IT'' (Standard)|''MPT(M)''|''S3M''|''XM''|''MOD''": Effekthervorhebung<br />
* '''takt'''="X": alle X Zeilen hervorheben<br />
* '''breite'''="X": Die Breite des Ausgabebereichs selber festlegen.<br />
* '''schriftgroesse'''="X": ein Wert zwischen 8 und 16 (die Grenzwerte können in der ''Settings''-Datei geändert werden.<br />
* '''farbschema'''="''MPT''|''FT2''|''IT''|''BUZZ'' (Standard)": Die selben 4 Standardfarbschemen, wie die in OpenMPT.<br />
* '''fett'''="''aus''|''nein''": Die Patterns werden nicht in Fettschrift ausgegeben.<br />
* '''zeilenabstand'''="''X(px|em|...)''"<br />
* '''spaltenabstand'''="''X(px|em|...''"<br />
* '''rahmen'''="''aus''": Schaltet den Rahmen aus. Die folgenden Elemente werden dadurch zusätzlich zum Rahmen deaktiviert:<br />
** '''titel'''="beschreibung"<br />
** '''titelfarbe'''="''#RrGgBb''|''#RGB''": Vordergrundfarbe des Titels<br />
** '''titelhintergrund'''="''#RrGgBb''|''#RGB''": Hintergrundfarbe des Titels<br />
** '''titelrahmen'''="''#RrGgBb''|''#RGB''|''aus''": Titelrahmenfarbe<br />
** '''rahmenfarbe'''="''#RrGgBb''|''#RGB''|''aus''": Farbe des äußeren Rahmens<br />
** '''ausrichtung'''="''links'' (Standard)|''rechts''|''mitte''"<br />
<br />
<br />
Wenn das Attribut ''id="aus"'' übergeben wird, wird der ID-String nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Ist ''rahmen="aus"'', dann muss ''id="an"'' explizit angegeben werden, um den ID-String zu zeigen. Bei ''rahmen="an"'' ist er standardmäßig eingeschaltet.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
Die Ausrichtung ''mitte'' sollte man nur bei Patterns mit mehreren Kanälen benutzen, da hier die gesamte Breite genutzt wird.<br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=637
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-26T17:59:03Z
<p>Cubaxd: /* Benutzung */</p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns im Wiki. Die Darstellung aller von OpenMPT unterstützten Modulformate funktioniert inzwischen ziemlich gut. Auch das direkte Kopieren der Patterns in den Pattern-Editor sollte problemlos laufen.<br />
<br />
== Installation ==<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen (für den Fall dass es mal mehr Dateien werden; womöglich kommt in der Zukunft noch eine css-Datei dazu (hoffentlich;))<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
'''Attribute:'''<br /><br />
<br />
Alle Werte von Attributen außer natürlich ''titel'' und die Attribute mit numerischen Parametern (X) sind case-insensitive.<br />
<br />
* '''header'''="''aus''": Der Headerstring wird nicht angezeigt<br />
* '''format'''="''IT'' (Standard)|''MPT(M)''|''S3M''|''XM''|''MOD''": Effekthervorhebung<br />
* '''takt'''="X": alle X Zeilen hervorheben<br />
* '''titel'''="beschreibung"<br />
* '''titelvg'''="''#RrGgBb''|''#RGB''": Vordergrundfarbe des Titels<br />
* '''titelhg'''="''#RrGgBb''|''#RGB''": Hintergrundfarbe des Titels<br />
* '''titelrahmen'''="''#RrGgBb''|''#RGB''": Rahmefarbe des Titels<br />
* '''rahmenfarbe'''="''#RrGgBb''|''#RGB''": Farbe des äußeren Rahmens<br />
* '''ausrichtung'''="''links'' (Standard)|''rechts''|''mitte''"<br />
* '''schriftgroesse'''="X": ein Wert zwischen 8 und 16<br />
* '''farbe'''="''MPT''|''FT2''|''IT''|''BUZZ'' (Standard)": Die selben 4 Standardfarbschemen, wie die in OpenMPT.<br />
* '''fett'''="''aus''|''nein''": Die Patterns werden nicht in Fettschrift ausgegeben.<br />
* '''breite'''="X": Die Breite des Ausgabebereichs selber festlegen.<br />
<br />
Wenn das Attribut ''header="aus"'' übergeben wird, wird der Headerstring nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
Die Ausrichtung ''mitte'' sollte man nur bei Patterns mit mehreren Kanälen benutzen, da hier die gesamte Breite genutzt wird und das Pattern selbst in der Mitte dargestellt wird.<br />
<br />
== Bekannte Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Das kann man derzeit auch nicht umgehen. Gibt es dafür eine Lösung??<br />
<br />
* Wird das vom Internet Explorer ordentlich dargestellt?<br />
:''Das Beispiel sieht im IE6 zumindest richtig aus...''<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich, dass der Code Bugs enthält, die ich übersehen habe, oder die für mich nicht offensichtlich sind, da ich mich sonst eigentlich nicht so intensiv mit PHP befasse :(.<br />
<br />
== Sourcecode ==<br />
<br />
<div style="border:1px solid #a88;background:#faa;padding:6px;"><br />
'''Wichtig:''' Der Quelltext sollte aus dem Bearbeitungsfenster kopiert werden und nicht aus dem Artikel, da die Funktion preg_replace() ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#dfd;"><br />
preg_replace('/ /', '&amp;nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... im Artikel so aussieht ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#fdd;"><br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... und so die feine Aufgabe bekommt, Leerzeichen durch Leerzeichen zu ersetzen :)<br />
</div><br />
<br />
'''MPTPatterns.php''' (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
(c)opyleft 2009 cubaxd<br />
<br />
Version: 0.3.1b<br />
URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern [attribute]><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
Attribute:<br />
takt="X"<br />
alle X Zeilen hervorheben<br />
header="aus"<br />
Header-String nicht anzeigen<br />
format="IT/MPTM/* (Standard)|XM||S3M|MOD"<br />
Modulformat. Wird nur berücksichtigt, wenn der<br />
Headerstring nicht im Pattern vorkommt!<br />
titel="beschreibung"<br />
titelvg="#RrGgBb|#RGB": Vordergrundfarbe des Titels<br />
titelhg="#RrGgBb|#RGB": Hintergrundfarbe des Titels<br />
titelrahmen="#RrGgBb|#RGB": Farbe für den Rahmen des Titels<br />
rahmenfarbe="#RrGgBb|#RGB": Farbe für den äußeren Rahmen<br />
ausrichtung="links (Standard)|rechts|mitte"<br />
farbe="mpt|ft2|it|buzz (standard)"<br />
welches Farbschema benutzt werden soll<br />
schriftgroesse="X"<br />
ein numerischer Wert <= 16<br />
fett="aus|nein"<br />
"aus" oder "nein" für dünne schrift,<br />
alles andere für fettschrift.<br />
breite="X"<br />
gesamtbreite<br />
<br />
<br />
Changelog:<br />
<br />
0.1b erster Versuch<br />
0.2b erste brauchbare Version<br />
0.3b - Farbschemen hinzugefügt. Attribut farbe="MPT|FT2|IT|BUZZ (Standard)"<br />
- Attribut schriftgroesse - mögliche Werte: 8-16<br />
- Attribut fett - "nein" oder "aus" schaltet fettschrift ab<br />
- Effektbefehle '\' und '#' beim IT-Format vergessen<br />
- MPTM und IT wurden nicht getrennt behandelt<br />
- Attribute titelvg, titelhg, titelrahmen und rahmenfarbe zum einstellen der Farben<br />
0.3.1b - Attribut breite<br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if( !defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die( -1 );<br />
}<br />
<br />
//Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980<br />
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {<br />
$wgHooks['ParserFirstCallInit'][] = 'MPT_Patterns_Init';<br />
} else { // Otherwise do things the old fashioned way<br />
$wgExtensionFunctions[] = 'MPT_Patterns_Init';<br />
}<br />
<br />
// Initialisierungsfunktion<br />
function MPT_Patterns_Init() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Pattern2HTML()<br />
*<br />
* Patterndaten einlesen und in HTML-Code einbetten<br />
*<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
// Modul-Header<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
// CSS-Daten<br />
$css_font= '12px Courier';<br />
$css_fontweight='bold';<br />
$css_padding_right= '4px'; // Lücke zwischen den Spalten<br />
<br />
$titel_maxlen = '256'; // Maximale Länge des Titels, alles drüber wird geköppt.<br />
<br />
$css_title_fg = '#ff0'; // Vordergrund des Titels<br />
$css_title_bg = '#336'; // Hintergrund des Titels<br />
$css_title_frame='#224'; // Rahmen des Titels<br />
<br />
$css_frame_color = '#000'; // Farbe des Rahmens<br />
<br />
$css_width='auto'; // gesamte Breite<br />
$css_min_width='20'; // mal ganz willkürlich ;)<br />
$css_max_width='1000'; // so wie hier auch<br />
<br />
if ( isset($args['rahmenfarbe'])) {<br />
$attrib['rahmenfarbe']=htmlspecialchars($args['rahmenfarbe']);<br />
$css_frame_color= (MPT_IsValidColor($attrib['rahmenfarbe']))<br />
? $attrib['rahmenfarbe']<br />
: $css_frame_color;<br />
}<br />
<br />
if ( isset($args['breite']) && is_numeric($args['breite'])) {<br />
$attrib['breite']=htmlspecialchars($args['breite']);<br />
// Breite nur übernehmen, wenn Wert im gültigen Bereich<br />
if ($attrib['breite']>=$css_min_width && $attrib['breite']<=$css_max_width) {<br />
$css_width=$attrib['breite'];<br />
}<br />
}<br />
<br />
// Der Ausgabebereich wird in der Mitte, auf der linken oder der rechten Seite dargestellt<br />
$style_outer_div_left =<br />
'<div style="float:left;margin-right:8px;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_right =<br />
'<div style="float:right;margin-left:8px;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_center =<br />
'<div style="text-align:center;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
<br />
<br />
<br />
// Attribute einlesen<br />
<br />
// enthält attribute, die an das tag übergeben werden<br />
$attrib=array();<br />
<br />
// Titel, -vordergrund- und -hintergrundfarbe<br />
if ( isset($args['titel']) ) {<br />
# titelvg<br />
if ( isset($args['titelvg'])) {<br />
$attrib['titelvg']=htmlspecialchars($args['titelvg']);<br />
$css_title_fg= (MPT_IsValidColor($attrib['titelvg']))<br />
? $attrib['titelvg']<br />
: $css_title_fg;<br />
}<br />
<br />
# titelhg<br />
if ( isset($args['titelhg'])) {<br />
$attrib['titelhg']=htmlspecialchars($args['titelhg']);<br />
$css_title_bg= (MPT_IsValidColor($attrib['titelhg']))<br />
? $attrib['titelhg']<br />
: $css_title_bg;<br />
}<br />
<br />
# titelrahmen<br />
if ( isset($args['titelrahmen'])) {<br />
$attrib['titelrahmen']=htmlspecialchars($args['titelrahmen']);<br />
$css_title_frame= (MPT_IsValidColor($attrib['titelrahmen']))<br />
? $attrib['titelrahmen']<br />
: $css_title_frame;<br />
}<br />
<br />
# titel<br />
$style_title =<br />
'<div style="width:auto;'.<br />
'padding:2px;'.<br />
'background-color:'.$css_title_bg.<br />
';color:'.$css_title_fg.';'.<br />
'font-weight:bold;'.<br />
'overflow:hidden;'.<br />
'border:1px solid '.$css_title_frame.';'.<br />
'text-align:center;'.<br />
'margin-bottom:0px;">';<br />
<br />
$titel = $style_title.htmlspecialchars($args['titel']).'</div>';<br />
if (strlen($titel)>$titel_maxlen)<br />
$titel = substr($titel, 0, $titel_maxlen-1);<br />
}<br />
<br />
#farbschema (MPT|FT2|IT|BUZZ)<br />
if ( isset($args['farbe']) )<br />
$attrib['farbe']=strtoupper(htmlspecialchars($args['farbe']));<br />
else $attrib['farbe']='BUZZ';<br />
<br />
// Die Farben für die Effekte sind in der Funktion<br />
// MPT_EffectColor() definiert.<br />
switch ($attrib['farbe']) {<br />
case 'MPT':<br />
$css_bgcol_normal = '#fff';<br />
$css_bgcol_highlight = '#e0e8e0';<br />
$color_note = '#000080';<br />
$color_instr= '#008080';<br />
break;<br />
case 'FT2':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#404080';<br />
$color_note = '#e0e040';<br />
$color_instr= '#ff0';<br />
break;<br />
case 'IT':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#305830'; // etwas dunkler als in OpenMPT<br />
$color_note = '#0f0';<br />
$color_instr= '#ff0';<br />
break;<br />
default: // buzz<br />
$css_bgcol_highlight='#d1cac0'; # Hintergrundfarbe hervorgehobener Zeilen<br />
$css_bgcol_normal='#e1dbd0'; # Hintergrundfarbe des <div>s<br />
$color_note = '#00005b';<br />
$color_instr= '#005555';<br />
break;<br />
}<br />
<br />
<br />
# schriftgröße<br />
if ( isset($args['schriftgroesse']) && is_numeric($args['schriftgroesse'])) {<br />
$attrib['schriftgroesse']=htmlspecialchars($args['schriftgroesse']);<br />
$css_font = ($attrib['schriftgroesse']>=8 && $attrib['schriftgroesse']<=16)<br />
? $attrib['schriftgroesse'].'px Courier'<br />
: $css_font;<br />
}<br />
<br />
# fett<br />
if ( isset($args['fett']) ) {<br />
$attrib['fett']=strtolower(htmlspecialchars($args['fett']));<br />
$css_fontweight = ($attrib['fett']=='nein'||$attrib['fett']=='aus') ? '' : $css_fontweight;<br />
}<br />
<br />
# ausrichtung<br />
if ( isset($args['ausrichtung']) ) {<br />
$seite = strtolower(htmlspecialchars($args['ausrichtung']));<br />
// Ausrichtung links als Standard, falls Wert ungültig<br />
if ($seite!='links' && $seite!='rechts' && $seite!='mitte') $seite ='links';<br />
if ($seite=='links')<br />
$outer_div=$style_outer_div_left.$titel;<br />
elseif ($seite=='rechts')<br />
$outer_div=$style_outer_div_right.$titel;<br />
else<br />
$outer_div=$style_outer_div_center.$titel;<br />
} else {<br />
$outer_div=$style_outer_div_left.$titel;<br />
}<br />
<br />
# takt<br />
if ( isset($args['takt'] ) && is_numeric($args['takt'] ) )<br />
$attrib['takt'] = htmlspecialchars($args['takt']);<br />
else<br />
$attrib['takt'] = 0;<br />
<br />
# header<br />
if ( isset($args['header']) )<br />
$attrib['header'] = strtolower(htmlspecialchars($args['header']));<br />
<br />
#format<br />
if ( isset($args['format']) )<br />
$attrib['format'] = strtoupper(htmlspecialchars($args['format']));<br />
<br />
<br />
<br />
<br />
// $ret ist der String der alle Daten enthält, die zurückgegeben werden.<br />
$ret = $outer_div.'<div style="width:auto;background-color:'.<br />
$css_bgcol_normal.';border:1px solid #aaa;padding:2px;">'."\n";<br />
<br />
$divider ='<span style="color:#888;">|</span>';<br />
<br />
$format = ''; # Enthält den Modul-Header des Patterns<br />
<br />
// Sequenz einlesen und zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
<br />
for ($j=0; $j<count($magic); $j++)<br />
if ($sequenz[$i] == $magic[$j])<br />
$format=$magic[$j];<br />
<br />
// wurde Header-String gefunden, brich schleife ab.<br />
if ($format) break;<br />
// sobald das erste |-Zeichen erscheint, ist es unwahscheinlich, dass<br />
// der Header danach noch kommt - also Suche abbrechen<br />
if (substr($sequenz[$i], 0, 1)=='|') break;<br />
}<br />
<br />
<br />
// Konnte Format nicht am Header erkannt werden,<br />
// wird nachgesehen, ob das "format"-Attribut angegeben wurde<br />
if ($format=='') {<br />
if ($attrib['format']>'') {<br />
switch ($attrib['format']) {<br />
case 'XM':<br />
$format=$magic[1];<br />
break;<br />
case 'MPT':<br />
case 'MPTM':<br />
$format=$magic[2];<br />
break;<br />
case 'S3M':<br />
$format=$magic[3];<br />
break;<br />
case 'MOD':<br />
$format=$magic[4];<br />
break;<br />
default: // IT<br />
$format=$magic[0];<br />
break;<br />
}<br />
}<br />
// Weder Header-String noch Format-Attribut übergeben.<br />
// Wir gehen dann vom IT-Format aus.<br />
else {<br />
$format=$magic[0];<br />
}<br />
}<br />
<br />
// Wurde header="aus" nicht übergeben, zeige Headerstring an<br />
if (!isset($attrib['header']) || strtolower($attrib['header']) != 'aus')<br />
$ret.='<span style="font:12px Courier;color:'.$color_note.'">'.<br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note (3 Zeichen: 1-3 (Zeichen 0: Divider |))<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument (2 Zeichen: 4-5)<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume (3 Zeichen: 6-8)<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt (3 Zeichen: 9-11)<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\:#])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
// Zeile wurde vollständig eingelesen, also $row inkrementieren<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
<br />
// Attribut takt="X": Alle X Zeilen hervorheben<br />
if (isset($attrib['takt']) && $attrib['takt']>0)<br />
$background = ($row % $attrib['takt']==0) ? $css_bgcol_highlight : '';<br />
<br />
# |<br />
$ret.= $divider;<br />
<br />
# Note<br />
$ret.= MPT_ConvData($data[$row][$channel]['note'],<br />
$color_note, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Instrument<br />
$ret.= MPT_ConvData($data[$row][$channel]['instr'],<br />
$color_instr, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Volume Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['vol'],<br />
MPT_EffectColor($data[$row][$channel]['vol'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Effect Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['eff'],<br />
MPT_EffectColor($data[$row][$channel]['eff'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
}<br />
// Jede Zeile mit einem Zeilenumbruch abschließen.<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div></div>'; # zwei geöffnete <div>-tags<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_IsValidColor()<br />
*<br />
* Prüft, ob ein übergebener Farbcode gültig ist.<br />
* Gültige Parameter sind nur #RrGgBb oder #RGB.<br />
* Ist Parameter nicht gültig, wird 0 zurückgegeben,<br />
* andernfalls 1.<br />
*/<br />
function MPT_IsValidColor($col) {<br />
if (preg_match("/^#[0-9A-Fa-f]{3}$/", $col) == 0)<br />
if (preg_match("/^#[0-9A-Fa-f]{6}$/", $col) == 0)<br />
return 0;<br />
<br />
return 1;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_ConvData()<br />
*<br />
* Funktion zum hinzufügen von style-Elementen in das<br />
* <span>-Tag. Das Tag selbst wird von MPT_Span() zurückgegeben.<br />
*/<br />
function MPT_ConvData(<br />
$dat, /* der Text selbst */<br />
$color, /* Schriftfarbe */<br />
$css_font, /* der Font */<br />
$css_fontweight, /* bold|normal */<br />
$css_padding_right, /* Größe der Lücke zwischen den Spalten */<br />
$background='' /* Hintergrund hervorgehobener Zeilen */<br />
)<br />
{<br />
return MPT_Span($dat,<br />
"color:$color;".<br />
(($css_font>'')<br />
? "font:$css_font;"<br />
: '') .<br />
(($css_fontweight>'')<br />
? "font-weight:$css_fontweight;"<br />
: '').<br />
(($css_padding_right>'')<br />
? "padding-right:$css_padding_right;"<br />
: '').<br />
(($background>'')<br />
? "background:$background;"<br />
: '')<br />
);<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Span()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
function MPT_Span($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_EffectColor($eff)<br />
*<br />
* Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
*/<br />
<br />
function MPT_EffectColor($eff, $format, $farbschema) {<br />
<br />
switch ($farbschema) {<br />
case 'MPT':<br />
$color_global = '#800000';<br />
$color_panning= '#008080';<br />
$color_volume = '#008000';<br />
$color_pitch = '#808000';<br />
$color_other = '#000';<br />
// für undefinierte/ungültige Befehle und leere Spalten<br />
$color_default= '#000';<br />
break;<br />
case 'FT2': // :-((((<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#ff0';<br />
$color_default= '#ff0';<br />
break;<br />
case 'IT':<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#0f0';<br />
$color_default= '#0f0';<br />
break;<br />
default: // BUZZ<br />
$color_global = '#600';<br />
$color_panning= '#006868';<br />
$color_volume = '#005e00';<br />
$color_pitch = '#626200';<br />
$color_other = '#343a27';<br />
$color_default= '#000';<br />
break;<br />
}<br />
<br />
// Format: IT<br />
if ($format == 'ModPlug Tracker IT'<br />
|| $format == 'ModPlug Tracker MPT')<br />
{<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdvDKLMNR<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch efghuo:EFGHU<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: S3M<br />
elseif ($format == 'ModPlug Tracker S3M') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume vDKLMNR<br />
case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N':<br />
case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch EFGHU<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S':<br />
case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: XM<br />
elseif ($format == 'ModPlug Tracker XM') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDFGH<br />
case 'B': case 'D': case 'F': case 'G': case 'H':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle lpr8PY<br />
case 'l': case 'p': case 'r':<br />
case '8': case 'P': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdv567AC<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch ghu1234<br />
case 'g': case 'h': case 'u':<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09EKLRTZ<br />
case '0': case '9': case 'E': case 'K': case 'L':<br />
case 'R': case 'T':case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: MOD<br />
elseif ($format == 'ModPlug Tracker MOD') {<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDF<br />
case 'B': case 'D': case 'F':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle 8<br />
case '8':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume 567AC<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch 1234<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09E<br />
case '0': case '9': case 'E':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: nicht definiert (einfarbig)<br />
else {<br />
$color=$color_default;<br />
}<br />
<br />
return $color;<br />
}<br />
<br />
?><br />
</pre><br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki_Diskussion:Werkstatt/MPTPatterns&diff=636
OpenMPT-Wiki Diskussion:Werkstatt/MPTPatterns
2009-01-26T17:57:13Z
<p>Cubaxd: /* Zu lange Titel */</p>
<hr />
<div>== Effektverlinkung ==<br />
<br />
Wenn wir einen Großteil der Effekte dokumentiert haben, lohnt es sich evtl, die Effekte im Pattern anklickbar zu machen (mit Link zur jeweiligen Wiki-Seite). Was sagst du dazu? :D<br />
: Wenn du das hinzufügen willst :) Ich denke mal, Sinn machen würde es eventuell schon, wenn es denn mal all die Artikel gibt ;)<br />
== Zu lange Titel ==<br />
<br />
Wie wäre es mit "overflow:hidden;"? ;)<br />
:Habs grad mit Opera probiert. Das scheint aber nicht zu gehen. Ich denke mal, weil ''with'' auf ''auto'' gestellt ist. Das muss aber so sein (denke ich mal), da man sonst die Breite immer von Hand eingeben muss.<br />
::Wenn man nur den Titel mit width:100%; ausstattet, sollte es theoretisch gehen.<br />
:::Bei mir hauts nicht hin. Wenn ich die Breite in der Variablen $style_title auf 100% stelle, schießt das &lt;div&gt; vom Titel rechts über den äußeren Rahmen hinaus und längere Texte werden trotzdem (auch mit overflow:auto) nicht auf mehrere Zeilen verteilt :( Bin es es eventuell auch komplett falsch angegangen.<br />
:::Ich denke mal das Problem ist, dass das äußere div-Tag sowieso eine automatische Breite hat, das passt sich ja der Breite der Inneren an. Und von daher bestimmt ja auch die Breite des Titels mit, wie breit das ganze "Fenster" ist :-/ Alles ein bisschen verzwickt ;)<br />
:::Hab mal noch das Attribut "breite" hinzugefügt. Das wäre jetzt die einzige Lösung die mir einfällt. Wenn aber der Titel sehr lang wird, haut wieder irgendwas mit der Darstellung nicht hin.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=635
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-26T17:55:34Z
<p>Cubaxd: /* Sourcecode */ + Attribut "breite"</p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns im Wiki. Die Darstellung aller von OpenMPT unterstützten Modulformate funktioniert inzwischen ziemlich gut. Auch das direkte Kopieren der Patterns in den Pattern-Editor sollte problemlos laufen.<br />
<br />
== Installation ==<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen (für den Fall dass es mal mehr Dateien werden; womöglich kommt in der Zukunft noch eine css-Datei dazu (hoffentlich;))<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
'''Attribute:'''<br /><br />
<br />
Alle Werte von Attributen außer natürlich ''titel'' und die Attribute mit numerischen Parametern (X) sind case-insensitive.<br />
<br />
* '''header'''="''aus''": Der Headerstring wird nicht angezeigt<br />
* '''format'''="''IT'' (Standard)|''MPT(M)''|''S3M''|''XM''|''MOD''": Effekthervorhebung<br />
* '''takt'''="X": alle X Zeilen hervorheben<br />
* '''titel'''="beschreibung"<br />
* '''titelvg'''="''#RrGgBb''|''#RGB''": Vordergrundfarbe des Titels<br />
* '''titelhg'''="''#RrGgBb''|''#RGB''": Hintergrundfarbe des Titels<br />
* '''titelrahmen'''="''#RrGgBb''|''#RGB''": Rahmefarbe des Titels<br />
* '''rahmenfarbe'''="''#RrGgBb''|''#RGB''": Farbe des äußeren Rahmens<br />
* '''ausrichtung'''="''links'' (Standard)|''rechts''|''mitte''"<br />
* '''schriftgroesse'''="X": ein Wert zwischen 8 und 16<br />
* '''farbe'''="''MPT''|''FT2''|''IT''|''BUZZ'' (Standard)": Die selben 4 Standardfarbschemen, wie die in OpenMPT.<br />
* '''fett'''="''aus''|''nein''": Die Patterns werden nicht in Fettschrift ausgegeben.<br />
<br />
Wenn das Attribut ''header="aus"'' übergeben wird, wird der Headerstring nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
Die Ausrichtung ''mitte'' sollte man nur bei Patterns mit mehreren Kanälen benutzen, da hier die gesamte Breite genutzt wird und das Pattern selbst in der Mitte dargestellt wird.<br />
<br />
== Bekannte Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Das kann man derzeit auch nicht umgehen. Gibt es dafür eine Lösung??<br />
<br />
* Wird das vom Internet Explorer ordentlich dargestellt?<br />
:''Das Beispiel sieht im IE6 zumindest richtig aus...''<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich, dass der Code Bugs enthält, die ich übersehen habe, oder die für mich nicht offensichtlich sind, da ich mich sonst eigentlich nicht so intensiv mit PHP befasse :(.<br />
<br />
== Sourcecode ==<br />
<br />
<div style="border:1px solid #a88;background:#faa;padding:6px;"><br />
'''Wichtig:''' Der Quelltext sollte aus dem Bearbeitungsfenster kopiert werden und nicht aus dem Artikel, da die Funktion preg_replace() ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#dfd;"><br />
preg_replace('/ /', '&amp;nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... im Artikel so aussieht ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#fdd;"><br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... und so die feine Aufgabe bekommt, Leerzeichen durch Leerzeichen zu ersetzen :)<br />
</div><br />
<br />
'''MPTPatterns.php''' (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
(c)opyleft 2009 cubaxd<br />
<br />
Version: 0.3.1b<br />
URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern [attribute]><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
Attribute:<br />
takt="X"<br />
alle X Zeilen hervorheben<br />
header="aus"<br />
Header-String nicht anzeigen<br />
format="IT/MPTM/* (Standard)|XM||S3M|MOD"<br />
Modulformat. Wird nur berücksichtigt, wenn der<br />
Headerstring nicht im Pattern vorkommt!<br />
titel="beschreibung"<br />
titelvg="#RrGgBb|#RGB": Vordergrundfarbe des Titels<br />
titelhg="#RrGgBb|#RGB": Hintergrundfarbe des Titels<br />
titelrahmen="#RrGgBb|#RGB": Farbe für den Rahmen des Titels<br />
rahmenfarbe="#RrGgBb|#RGB": Farbe für den äußeren Rahmen<br />
ausrichtung="links (Standard)|rechts|mitte"<br />
farbe="mpt|ft2|it|buzz (standard)"<br />
welches Farbschema benutzt werden soll<br />
schriftgroesse="X"<br />
ein numerischer Wert <= 16<br />
fett="aus|nein"<br />
"aus" oder "nein" für dünne schrift,<br />
alles andere für fettschrift.<br />
breite="X"<br />
gesamtbreite<br />
<br />
<br />
Changelog:<br />
<br />
0.1b erster Versuch<br />
0.2b erste brauchbare Version<br />
0.3b - Farbschemen hinzugefügt. Attribut farbe="MPT|FT2|IT|BUZZ (Standard)"<br />
- Attribut schriftgroesse - mögliche Werte: 8-16<br />
- Attribut fett - "nein" oder "aus" schaltet fettschrift ab<br />
- Effektbefehle '\' und '#' beim IT-Format vergessen<br />
- MPTM und IT wurden nicht getrennt behandelt<br />
- Attribute titelvg, titelhg, titelrahmen und rahmenfarbe zum einstellen der Farben<br />
0.3.1b - Attribut breite<br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if( !defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die( -1 );<br />
}<br />
<br />
//Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980<br />
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {<br />
$wgHooks['ParserFirstCallInit'][] = 'MPT_Patterns_Init';<br />
} else { // Otherwise do things the old fashioned way<br />
$wgExtensionFunctions[] = 'MPT_Patterns_Init';<br />
}<br />
<br />
// Initialisierungsfunktion<br />
function MPT_Patterns_Init() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Pattern2HTML()<br />
*<br />
* Patterndaten einlesen und in HTML-Code einbetten<br />
*<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
// Modul-Header<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
// CSS-Daten<br />
$css_font= '12px Courier';<br />
$css_fontweight='bold';<br />
$css_padding_right= '4px'; // Lücke zwischen den Spalten<br />
<br />
$titel_maxlen = '256'; // Maximale Länge des Titels, alles drüber wird geköppt.<br />
<br />
$css_title_fg = '#ff0'; // Vordergrund des Titels<br />
$css_title_bg = '#336'; // Hintergrund des Titels<br />
$css_title_frame='#224'; // Rahmen des Titels<br />
<br />
$css_frame_color = '#000'; // Farbe des Rahmens<br />
<br />
$css_width='auto'; // gesamte Breite<br />
$css_min_width='20'; // mal ganz willkürlich ;)<br />
$css_max_width='1000'; // so wie hier auch<br />
<br />
if ( isset($args['rahmenfarbe'])) {<br />
$attrib['rahmenfarbe']=htmlspecialchars($args['rahmenfarbe']);<br />
$css_frame_color= (MPT_IsValidColor($attrib['rahmenfarbe']))<br />
? $attrib['rahmenfarbe']<br />
: $css_frame_color;<br />
}<br />
<br />
if ( isset($args['breite']) && is_numeric($args['breite'])) {<br />
$attrib['breite']=htmlspecialchars($args['breite']);<br />
// Breite nur übernehmen, wenn Wert im gültigen Bereich<br />
if ($attrib['breite']>=$css_min_width && $attrib['breite']<=$css_max_width) {<br />
$css_width=$attrib['breite'];<br />
}<br />
}<br />
<br />
// Der Ausgabebereich wird in der Mitte, auf der linken oder der rechten Seite dargestellt<br />
$style_outer_div_left =<br />
'<div style="float:left;margin-right:8px;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_right =<br />
'<div style="float:right;margin-left:8px;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_center =<br />
'<div style="text-align:center;'.<br />
(($css_width!='auto') ? "width:${css_width}px;" : "width:$css_width;" ).<br />
(($css_width!='auto') ? "max-width:${css_width}px;" : '' ).<br />
'padding:0px;border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
<br />
<br />
<br />
// Attribute einlesen<br />
<br />
// enthält attribute, die an das tag übergeben werden<br />
$attrib=array();<br />
<br />
// Titel, -vordergrund- und -hintergrundfarbe<br />
if ( isset($args['titel']) ) {<br />
# titelvg<br />
if ( isset($args['titelvg'])) {<br />
$attrib['titelvg']=htmlspecialchars($args['titelvg']);<br />
$css_title_fg= (MPT_IsValidColor($attrib['titelvg']))<br />
? $attrib['titelvg']<br />
: $css_title_fg;<br />
}<br />
<br />
# titelhg<br />
if ( isset($args['titelhg'])) {<br />
$attrib['titelhg']=htmlspecialchars($args['titelhg']);<br />
$css_title_bg= (MPT_IsValidColor($attrib['titelhg']))<br />
? $attrib['titelhg']<br />
: $css_title_bg;<br />
}<br />
<br />
# titelrahmen<br />
if ( isset($args['titelrahmen'])) {<br />
$attrib['titelrahmen']=htmlspecialchars($args['titelrahmen']);<br />
$css_title_frame= (MPT_IsValidColor($attrib['titelrahmen']))<br />
? $attrib['titelrahmen']<br />
: $css_title_frame;<br />
}<br />
<br />
# titel<br />
$style_title =<br />
'<div style="width:auto;'.<br />
'padding:2px;'.<br />
'background-color:'.$css_title_bg.<br />
';color:'.$css_title_fg.';'.<br />
'font-weight:bold;'.<br />
'overflow:hidden;'.<br />
'border:1px solid '.$css_title_frame.';'.<br />
'text-align:center;'.<br />
'margin-bottom:0px;">';<br />
<br />
$titel = $style_title.htmlspecialchars($args['titel']).'</div>';<br />
if (strlen($titel)>$titel_maxlen)<br />
$titel = substr($titel, 0, $titel_maxlen-1);<br />
}<br />
<br />
#farbschema (MPT|FT2|IT|BUZZ)<br />
if ( isset($args['farbe']) )<br />
$attrib['farbe']=strtoupper(htmlspecialchars($args['farbe']));<br />
else $attrib['farbe']='BUZZ';<br />
<br />
// Die Farben für die Effekte sind in der Funktion<br />
// MPT_EffectColor() definiert.<br />
switch ($attrib['farbe']) {<br />
case 'MPT':<br />
$css_bgcol_normal = '#fff';<br />
$css_bgcol_highlight = '#e0e8e0';<br />
$color_note = '#000080';<br />
$color_instr= '#008080';<br />
break;<br />
case 'FT2':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#404080';<br />
$color_note = '#e0e040';<br />
$color_instr= '#ff0';<br />
break;<br />
case 'IT':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#305830'; // etwas dunkler als in OpenMPT<br />
$color_note = '#0f0';<br />
$color_instr= '#ff0';<br />
break;<br />
default: // buzz<br />
$css_bgcol_highlight='#d1cac0'; # Hintergrundfarbe hervorgehobener Zeilen<br />
$css_bgcol_normal='#e1dbd0'; # Hintergrundfarbe des <div>s<br />
$color_note = '#00005b';<br />
$color_instr= '#005555';<br />
break;<br />
}<br />
<br />
<br />
# schriftgröße<br />
if ( isset($args['schriftgroesse']) && is_numeric($args['schriftgroesse'])) {<br />
$attrib['schriftgroesse']=htmlspecialchars($args['schriftgroesse']);<br />
$css_font = ($attrib['schriftgroesse']>=8 && $attrib['schriftgroesse']<=16)<br />
? $attrib['schriftgroesse'].'px Courier'<br />
: $css_font;<br />
}<br />
<br />
# fett<br />
if ( isset($args['fett']) ) {<br />
$attrib['fett']=strtolower(htmlspecialchars($args['fett']));<br />
$css_fontweight = ($attrib['fett']=='nein'||$attrib['fett']=='aus') ? '' : $css_fontweight;<br />
}<br />
<br />
# ausrichtung<br />
if ( isset($args['ausrichtung']) ) {<br />
$seite = strtolower(htmlspecialchars($args['ausrichtung']));<br />
// Ausrichtung links als Standard, falls Wert ungültig<br />
if ($seite!='links' && $seite!='rechts' && $seite!='mitte') $seite ='links';<br />
if ($seite=='links')<br />
$outer_div=$style_outer_div_left.$titel;<br />
elseif ($seite=='rechts')<br />
$outer_div=$style_outer_div_right.$titel;<br />
else<br />
$outer_div=$style_outer_div_center.$titel;<br />
} else {<br />
$outer_div=$style_outer_div_left.$titel;<br />
}<br />
<br />
# takt<br />
if ( isset($args['takt'] ) && is_numeric($args['takt'] ) )<br />
$attrib['takt'] = htmlspecialchars($args['takt']);<br />
else<br />
$attrib['takt'] = 0;<br />
<br />
# header<br />
if ( isset($args['header']) )<br />
$attrib['header'] = strtolower(htmlspecialchars($args['header']));<br />
<br />
#format<br />
if ( isset($args['format']) )<br />
$attrib['format'] = strtoupper(htmlspecialchars($args['format']));<br />
<br />
<br />
<br />
<br />
// $ret ist der String der alle Daten enthält, die zurückgegeben werden.<br />
$ret = $outer_div.'<div style="width:auto;background-color:'.<br />
$css_bgcol_normal.';border:1px solid #aaa;padding:2px;">'."\n";<br />
<br />
$divider ='<span style="color:#888;">|</span>';<br />
<br />
$format = ''; # Enthält den Modul-Header des Patterns<br />
<br />
// Sequenz einlesen und zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
<br />
for ($j=0; $j<count($magic); $j++)<br />
if ($sequenz[$i] == $magic[$j])<br />
$format=$magic[$j];<br />
<br />
// wurde Header-String gefunden, brich schleife ab.<br />
if ($format) break;<br />
// sobald das erste |-Zeichen erscheint, ist es unwahscheinlich, dass<br />
// der Header danach noch kommt - also Suche abbrechen<br />
if (substr($sequenz[$i], 0, 1)=='|') break;<br />
}<br />
<br />
<br />
// Konnte Format nicht am Header erkannt werden,<br />
// wird nachgesehen, ob das "format"-Attribut angegeben wurde<br />
if ($format=='') {<br />
if ($attrib['format']>'') {<br />
switch ($attrib['format']) {<br />
case 'XM':<br />
$format=$magic[1];<br />
break;<br />
case 'MPT':<br />
case 'MPTM':<br />
$format=$magic[2];<br />
break;<br />
case 'S3M':<br />
$format=$magic[3];<br />
break;<br />
case 'MOD':<br />
$format=$magic[4];<br />
break;<br />
default: // IT<br />
$format=$magic[0];<br />
break;<br />
}<br />
}<br />
// Weder Header-String noch Format-Attribut übergeben.<br />
// Wir gehen dann vom IT-Format aus.<br />
else {<br />
$format=$magic[0];<br />
}<br />
}<br />
<br />
// Wurde header="aus" nicht übergeben, zeige Headerstring an<br />
if (!isset($attrib['header']) || strtolower($attrib['header']) != 'aus')<br />
$ret.='<span style="font:12px Courier;color:'.$color_note.'">'.<br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note (3 Zeichen: 1-3 (Zeichen 0: Divider |))<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument (2 Zeichen: 4-5)<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume (3 Zeichen: 6-8)<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt (3 Zeichen: 9-11)<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\:#])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
// Zeile wurde vollständig eingelesen, also $row inkrementieren<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
<br />
// Attribut takt="X": Alle X Zeilen hervorheben<br />
if (isset($attrib['takt']) && $attrib['takt']>0)<br />
$background = ($row % $attrib['takt']==0) ? $css_bgcol_highlight : '';<br />
<br />
# |<br />
$ret.= $divider;<br />
<br />
# Note<br />
$ret.= MPT_ConvData($data[$row][$channel]['note'],<br />
$color_note, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Instrument<br />
$ret.= MPT_ConvData($data[$row][$channel]['instr'],<br />
$color_instr, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Volume Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['vol'],<br />
MPT_EffectColor($data[$row][$channel]['vol'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Effect Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['eff'],<br />
MPT_EffectColor($data[$row][$channel]['eff'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
}<br />
// Jede Zeile mit einem Zeilenumbruch abschließen.<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div></div>'; # zwei geöffnete <div>-tags<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_IsValidColor()<br />
*<br />
* Prüft, ob ein übergebener Farbcode gültig ist.<br />
* Gültige Parameter sind nur #RrGgBb oder #RGB.<br />
* Ist Parameter nicht gültig, wird 0 zurückgegeben,<br />
* andernfalls 1.<br />
*/<br />
function MPT_IsValidColor($col) {<br />
if (preg_match("/^#[0-9A-Fa-f]{3}$/", $col) == 0)<br />
if (preg_match("/^#[0-9A-Fa-f]{6}$/", $col) == 0)<br />
return 0;<br />
<br />
return 1;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_ConvData()<br />
*<br />
* Funktion zum hinzufügen von style-Elementen in das<br />
* <span>-Tag. Das Tag selbst wird von MPT_Span() zurückgegeben.<br />
*/<br />
function MPT_ConvData(<br />
$dat, /* der Text selbst */<br />
$color, /* Schriftfarbe */<br />
$css_font, /* der Font */<br />
$css_fontweight, /* bold|normal */<br />
$css_padding_right, /* Größe der Lücke zwischen den Spalten */<br />
$background='' /* Hintergrund hervorgehobener Zeilen */<br />
)<br />
{<br />
return MPT_Span($dat,<br />
"color:$color;".<br />
(($css_font>'')<br />
? "font:$css_font;"<br />
: '') .<br />
(($css_fontweight>'')<br />
? "font-weight:$css_fontweight;"<br />
: '').<br />
(($css_padding_right>'')<br />
? "padding-right:$css_padding_right;"<br />
: '').<br />
(($background>'')<br />
? "background:$background;"<br />
: '')<br />
);<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Span()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
function MPT_Span($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_EffectColor($eff)<br />
*<br />
* Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
*/<br />
<br />
function MPT_EffectColor($eff, $format, $farbschema) {<br />
<br />
switch ($farbschema) {<br />
case 'MPT':<br />
$color_global = '#800000';<br />
$color_panning= '#008080';<br />
$color_volume = '#008000';<br />
$color_pitch = '#808000';<br />
$color_other = '#000';<br />
// für undefinierte/ungültige Befehle und leere Spalten<br />
$color_default= '#000';<br />
break;<br />
case 'FT2': // :-((((<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#ff0';<br />
$color_default= '#ff0';<br />
break;<br />
case 'IT':<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#0f0';<br />
$color_default= '#0f0';<br />
break;<br />
default: // BUZZ<br />
$color_global = '#600';<br />
$color_panning= '#006868';<br />
$color_volume = '#005e00';<br />
$color_pitch = '#626200';<br />
$color_other = '#343a27';<br />
$color_default= '#000';<br />
break;<br />
}<br />
<br />
// Format: IT<br />
if ($format == 'ModPlug Tracker IT'<br />
|| $format == 'ModPlug Tracker MPT')<br />
{<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdvDKLMNR<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch efghuo:EFGHU<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: S3M<br />
elseif ($format == 'ModPlug Tracker S3M') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume vDKLMNR<br />
case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N':<br />
case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch EFGHU<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S':<br />
case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: XM<br />
elseif ($format == 'ModPlug Tracker XM') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDFGH<br />
case 'B': case 'D': case 'F': case 'G': case 'H':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle lpr8PY<br />
case 'l': case 'p': case 'r':<br />
case '8': case 'P': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdv567AC<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch ghu1234<br />
case 'g': case 'h': case 'u':<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09EKLRTZ<br />
case '0': case '9': case 'E': case 'K': case 'L':<br />
case 'R': case 'T':case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: MOD<br />
elseif ($format == 'ModPlug Tracker MOD') {<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDF<br />
case 'B': case 'D': case 'F':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle 8<br />
case '8':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume 567AC<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch 1234<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09E<br />
case '0': case '9': case 'E':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: nicht definiert (einfarbig)<br />
else {<br />
$color=$color_default;<br />
}<br />
<br />
return $color;<br />
}<br />
<br />
?><br />
</pre><br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki_Diskussion:Werkstatt/MPTPatterns&diff=634
OpenMPT-Wiki Diskussion:Werkstatt/MPTPatterns
2009-01-26T17:29:43Z
<p>Cubaxd: /* Zu lange Titel */</p>
<hr />
<div>== Effektverlinkung ==<br />
<br />
Wenn wir einen Großteil der Effekte dokumentiert haben, lohnt es sich evtl, die Effekte im Pattern anklickbar zu machen (mit Link zur jeweiligen Wiki-Seite). Was sagst du dazu? :D<br />
: Wenn du das hinzufügen willst :) Ich denke mal, Sinn machen würde es eventuell schon, wenn es denn mal all die Artikel gibt ;)<br />
== Zu lange Titel ==<br />
<br />
Wie wäre es mit "overflow:hidden;"? ;)<br />
:Habs grad mit Opera probiert. Das scheint aber nicht zu gehen. Ich denke mal, weil ''with'' auf ''auto'' gestellt ist. Das muss aber so sein (denke ich mal), da man sonst die Breite immer von Hand eingeben muss.<br />
::Wenn man nur den Titel mit width:100%; ausstattet, sollte es theoretisch gehen.<br />
:::Bei mir hauts nicht hin. Wenn ich die Breite in der Variablen $style_title auf 100% stelle, schießt das &lt;div&gt; vom Titel rechts über den äußeren Rahmen hinaus und längere Texte werden trotzdem (auch mit overflow:auto) nicht auf mehrere Zeilen verteilt :( Bin es es eventuell auch komplett falsch angegangen.<br />
:::Ich denke mal das Problem ist, dass das äußere div-Tag sowieso eine automatische Breite hat, das passt sich ja der Breite der Inneren an. Und von daher bestimmt ja auch die Breite des Titels mit, wie breit das ganze "Fenster" ist :-/ Alles ein bisschen verzwickt ;)</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki_Diskussion:Werkstatt/MPTPatterns&diff=633
OpenMPT-Wiki Diskussion:Werkstatt/MPTPatterns
2009-01-26T17:20:30Z
<p>Cubaxd: /* Zu lange Titel */</p>
<hr />
<div>== Effektverlinkung ==<br />
<br />
Wenn wir einen Großteil der Effekte dokumentiert haben, lohnt es sich evtl, die Effekte im Pattern anklickbar zu machen (mit Link zur jeweiligen Wiki-Seite). Was sagst du dazu? :D<br />
: Wenn du das hinzufügen willst :) Ich denke mal, Sinn machen würde es eventuell schon, wenn es denn mal all die Artikel gibt ;)<br />
== Zu lange Titel ==<br />
<br />
Wie wäre es mit "overflow:hidden;"? ;)<br />
:Habs grad mit Opera probiert. Das scheint aber nicht zu gehen. Ich denke mal, weil ''with'' auf ''auto'' gestellt ist. Das muss aber so sein (denke ich mal), da man sonst die Breite immer von Hand eingeben muss.<br />
::Wenn man nur den Titel mit width:100%; ausstattet, sollte es theoretisch gehen.<br />
:::Bei mir hauts nicht hin. Wenn ich die Breite in der Variablen $style_title auf 100% stelle, schießt das <div> vom Titel rechts über den äußeren Rahmen hinaus und längere Texte werden trotzdem (auch mit overflow:auto) nicht auf mehrere Zeilen verteilt :( Bin es es eventuell auch komplett falsch angegangen.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki_Diskussion:Werkstatt/MPTPatterns&diff=630
OpenMPT-Wiki Diskussion:Werkstatt/MPTPatterns
2009-01-26T16:50:00Z
<p>Cubaxd: </p>
<hr />
<div>== Effektverlinkung ==<br />
<br />
Wenn wir einen Großteil der Effekte dokumentiert haben, lohnt es sich evtl, die Effekte im Pattern anklickbar zu machen (mit Link zur jeweiligen Wiki-Seite). Was sagst du dazu? :D<br />
: Wenn du das hinzufügen willst :) Ich denke mal, Sinn machen würde es eventuell schon, wenn es denn mal all die Artikel gibt ;)<br />
== Zu lange Titel ==<br />
<br />
Wie wäre es mit "overflow:hidden;"? ;)<br />
:Habs grad mit Opera probiert. Das scheint aber nicht zu gehen. Ich denke mal, weil ''with'' auf ''auto'' gestellt ist. Das muss aber so sein (denke ich mal), da man sonst die Breite immer von Hand eingeben muss.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=627
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-26T15:26:48Z
<p>Cubaxd: </p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns im Wiki. Die Darstellung aller von OpenMPT unterstützten Modulformate funktioniert inzwischen ziemlich gut. Auch das direkte Kopieren der Patterns in den Pattern-Editor sollte problemlos laufen.<br />
<br />
== Installation ==<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen (für den Fall dass es mal mehr Dateien werden; womöglich kommt in der Zukunft noch eine css-Datei dazu (hoffentlich;))<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
'''Attribute:'''<br /><br />
<br />
Alle Werte von Attributen außer natürlich ''titel'' und die Attribute mit numerischen Parametern (X) sind case-insensitive.<br />
<br />
* '''header'''="''aus''": Der Headerstring wird nicht angezeigt<br />
* '''format'''="''IT'' (Standard)|''MPT(M)''|''S3M''|''XM''|''MOD''": Effekthervorhebung<br />
* '''takt'''="X": alle X Zeilen hervorheben<br />
* '''titel'''="beschreibung"<br />
* '''titelvg'''="''#RrGgBb''|''#RGB''": Vordergrundfarbe des Titels<br />
* '''titelhg'''="''#RrGgBb''|''#RGB''": Hintergrundfarbe des Titels<br />
* '''titelrahmen'''="''#RrGgBb''|''#RGB''": Rahmefarbe des Titels<br />
* '''rahmenfarbe'''="''#RrGgBb''|''#RGB''": Farbe des äußeren Rahmens<br />
* '''ausrichtung'''="''links'' (Standard)|''rechts''|''mitte''"<br />
* '''schriftgroesse'''="X": ein Wert zwischen 8 und 16<br />
* '''farbe'''="''MPT''|''FT2''|''IT''|''BUZZ'' (Standard)": Die selben 4 Standardfarbschemen, wie die in OpenMPT.<br />
* '''fett'''="''aus''|''nein''": Die Patterns werden nicht in Fettschrift ausgegeben.<br />
<br />
Wenn das Attribut ''header="aus"'' übergeben wird, wird der Headerstring nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
Die Ausrichtung ''mitte'' sollte man nur bei Patterns mit mehreren Kanälen benutzen, da hier die gesamte Breite genutzt wird und das Pattern selbst in der Mitte dargestellt wird.<br />
<br />
== Bekannte Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Das kann man derzeit auch nicht umgehen. Gibt es dafür eine Lösung??<br />
<br />
* Wird das vom Internet Explorer ordentlich dargestellt?<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich, dass der Code Bugs enthält, die ich übersehen habe, oder die für mich nicht offensichtlich sind, da ich mich sonst eigentlich nicht so intensiv mit PHP befasse :(.<br />
<br />
== Sourcecode ==<br />
<br />
<div style="border:1px solid #a88;background:#faa;padding:6px;"><br />
'''Wichtig:''' Der Quelltext sollte aus dem Bearbeitungsfenster kopiert werden und nicht aus dem Artikel, da die Funktion preg_replace() ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#dfd;"><br />
preg_replace('/ /', '&amp;nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... im Artikel so aussieht ...<br />
<pre style="padding:2px; margin:2px; border:1px solid #a88;background-color:#fdd;"><br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
</pre><br />
... und so die feine Aufgabe bekommt, Leerzeichen durch Leerzeichen zu ersetzen :)<br />
</div><br />
<br />
'''MPTPatterns.php''' (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
(c)opyleft 2009 cubaxd<br />
<br />
Version: 0.3b<br />
URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern [attribute]><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
Attribute:<br />
takt="X"<br />
alle X Zeilen hervorheben<br />
header="aus"<br />
Header-String nicht anzeigen<br />
format="IT/MPTM/* (Standard)|XM||S3M|MOD"<br />
Modulformat. Wird nur berücksichtigt, wenn der<br />
Headerstring nicht im Pattern vorkommt!<br />
titel="beschreibung"<br />
titelvg="#RrGgBb|#RGB": Vordergrundfarbe des Titels<br />
titelhg="#RrGgBb|#RGB": Hintergrundfarbe des Titels<br />
titelrahmen="#RrGgBb|#RGB": Farbe für den Rahmen des Titels<br />
rahmenfarbe="#RrGgBb|#RGB": Farbe für den äußeren Rahmen<br />
ausrichtung="links (Standard)|rechts|mitte"<br />
farbe="mpt|ft2|it|buzz (standard)"<br />
welches Farbschema benutzt werden soll<br />
schriftgroesse="X"<br />
ein numerischer Wert <= 16<br />
fett="aus|nein"<br />
"aus" oder "nein" für dünne schrift,<br />
alles andere für fettschrift.<br />
<br />
<br />
Changelog:<br />
<br />
0.1b erster Versuch<br />
0.2b erste brauchbare Version<br />
0.3b - Farbschemen hinzugefügt. Attribut farbe="MPT|FT2|IT|BUZZ (Standard)"<br />
- Attribut schriftgroesse - mögliche Werte: 8-16<br />
- Attribut fett - "nein" oder "aus" schaltet fettschrift ab<br />
- Effektbefehle '\' und '#' beim IT-Format vergessen<br />
- MPTM und IT wurden nicht getrennt behandelt<br />
- Attribute titelvg, titelhg, titelrahmen und rahmenfarbe zum einstellen der Farben<br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if( !defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die( -1 );<br />
}<br />
<br />
if ( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {<br />
$wgHooks['ParserFirstCallInit'][] = 'MPT_Patterns_Init';<br />
} else { // Otherwise do things the old fashioned way<br />
$wgExtensionFunctions[] = 'MPT_Patterns_Init';<br />
}<br />
<br />
// Initialisierungsfunktion<br />
function MPT_Patterns_Init() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Pattern2HTML()<br />
*<br />
* Patterndaten einlesen und in HTML-Code einbetten<br />
*<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
// Modul-Header<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
// CSS-Daten<br />
$css_font= '12px Courier';<br />
$css_fontweight='bold';<br />
$css_padding_right= '4px'; // Lücke zwischen den Spalten<br />
<br />
$titel_maxlen = '256'; // Maximale Länge des Titels, alles drüber wird geköppt.<br />
<br />
$css_title_fg = '#ff0'; // Vordergrund des Titels<br />
$css_title_bg = '#336'; // Hintergrund des Titels<br />
$css_title_frame='#224'; // Rahmen des Titels<br />
<br />
$css_frame_color = '#000'; // Farbe des Rahmens<br />
<br />
if ( isset($args['rahmenfarbe'])) {<br />
$attrib['rahmenfarbe']=htmlspecialchars($args['rahmenfarbe']);<br />
$css_frame_color= (MPT_IsValidColor($attrib['rahmenfarbe']))<br />
? $attrib['rahmenfarbe']<br />
: $css_frame_color;<br />
}<br />
<br />
// Der Ausgabebereich wird auf der linken oder der rechten Seite dargestellt<br />
$style_outer_div_left =<br />
'<div style="float:left;width:auto;margin-right:8px;padding:0px;'.<br />
'border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_right =<br />
'<div style="float:right;width:auto;margin-left:8px;padding:0px;'.<br />
'border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
$style_outer_div_center =<br />
'<div style="text-align:center;width:auto;;padding:0px;'.<br />
'border:1px solid '.$css_frame_color.';background:#ddd;">';<br />
<br />
<br />
<br />
// Attribute einlesen<br />
<br />
// enthält attribute, die an das tag übergeben werden<br />
$attrib=array();<br />
<br />
// Titel, -vordergrund- und -hintergrundfarbe<br />
if ( isset($args['titel']) ) {<br />
# titelvg<br />
if ( isset($args['titelvg'])) {<br />
$attrib['titelvg']=htmlspecialchars($args['titelvg']);<br />
$css_title_fg= (MPT_IsValidColor($attrib['titelvg']))<br />
? $attrib['titelvg']<br />
: $css_title_fg;<br />
}<br />
<br />
# titelhg<br />
if ( isset($args['titelhg'])) {<br />
$attrib['titelhg']=htmlspecialchars($args['titelhg']);<br />
$css_title_bg= (MPT_IsValidColor($attrib['titelhg']))<br />
? $attrib['titelhg']<br />
: $css_title_bg;<br />
}<br />
<br />
# titelrahmen<br />
if ( isset($args['titelrahmen'])) {<br />
$attrib['titelrahmen']=htmlspecialchars($args['titelrahmen']);<br />
$css_title_frame= (MPT_IsValidColor($attrib['titelrahmen']))<br />
? $attrib['titelrahmen']<br />
: $css_title_frame;<br />
}<br />
<br />
# titel<br />
$style_title =<br />
'<div style="width:auto;padding:2px;'.<br />
'background-color:'.$css_title_bg.<br />
';color:'.$css_title_fg.';'.<br />
'font-weight:bold;'.<br />
'border:1px solid '.$css_title_frame.';'.<br />
'text-align:center;'.<br />
'margin-bottom:0px;">';<br />
<br />
$titel = $style_title.htmlspecialchars($args['titel']).'</div>';<br />
if (strlen($titel)>$titel_maxlen)<br />
$titel = substr($titel, 0, $titel_maxlen-1);<br />
}<br />
<br />
#farbschema (MPT|FT2|IT|BUZZ)<br />
if ( isset($args['farbe']) )<br />
$attrib['farbe']=strtoupper(htmlspecialchars($args['farbe']));<br />
else $attrib['farbe']='BUZZ';<br />
<br />
// Die Farben für die Effekte sind in der Funktion<br />
// MPT_EffectColor() definiert.<br />
switch ($attrib['farbe']) {<br />
case 'MPT':<br />
$css_bgcol_normal = '#fff';<br />
$css_bgcol_highlight = '#e0e8e0';<br />
$color_note = '#000080';<br />
$color_instr= '#008080';<br />
break;<br />
case 'FT2':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#404080';<br />
$color_note = '#e0e040';<br />
$color_instr= '#ff0';<br />
break;<br />
case 'IT':<br />
$css_bgcol_normal = '#000';<br />
$css_bgcol_highlight = '#305830'; // etwas dunkler als in OpenMPT<br />
$color_note = '#0f0';<br />
$color_instr= '#ff0';<br />
break;<br />
default: // buzz<br />
$css_bgcol_highlight='#d1cac0'; # Hintergrundfarbe hervorgehobener Zeilen<br />
$css_bgcol_normal='#e1dbd0'; # Hintergrundfarbe des <div>s<br />
$color_note = '#00005b';<br />
$color_instr= '#005555';<br />
break;<br />
}<br />
<br />
<br />
# schriftgröße<br />
if ( isset($args['schriftgroesse']) && is_numeric($args['schriftgroesse'])) {<br />
$attrib['schriftgroesse']=htmlspecialchars($args['schriftgroesse']);<br />
$css_font = ($attrib['schriftgroesse']>=8 && $attrib['schriftgroesse']<=16)<br />
? $attrib['schriftgroesse'].'px Courier'<br />
: $css_font;<br />
}<br />
<br />
# fett<br />
if ( isset($args['fett']) ) {<br />
$attrib['fett']=strtolower(htmlspecialchars($args['fett']));<br />
$css_fontweight = ($attrib['fett']=='nein'||$attrib['fett']=='aus') ? '' : $css_fontweight;<br />
}<br />
<br />
# ausrichtung<br />
if ( isset($args['ausrichtung']) ) {<br />
$seite = strtolower(htmlspecialchars($args['ausrichtung']));<br />
// Ausrichtung links als Standard, falls Wert ungültig<br />
if ($seite!='links' && $seite!='rechts' && $seite!='mitte') $seite ='links';<br />
if ($seite=='links')<br />
$outer_div=$style_outer_div_left.$titel;<br />
elseif ($seite=='rechts')<br />
$outer_div=$style_outer_div_right.$titel;<br />
else<br />
$outer_div=$style_outer_div_center.$titel;<br />
} else {<br />
$outer_div=$style_outer_div_left.$titel;<br />
}<br />
<br />
# takt<br />
if ( isset($args['takt'] ) && is_numeric($args['takt'] ) )<br />
$attrib['takt'] = htmlspecialchars($args['takt']);<br />
else<br />
$attrib['takt'] = 0;<br />
<br />
# header<br />
if ( isset($args['header']) )<br />
$attrib['header'] = strtolower(htmlspecialchars($args['header']));<br />
<br />
#format<br />
if ( isset($args['format']) )<br />
$attrib['format'] = strtoupper(htmlspecialchars($args['format']));<br />
<br />
<br />
<br />
<br />
// $ret ist der String der alle Daten enthält, die zurückgegeben werden.<br />
$ret = $outer_div.'<div style="width:auto;background-color:'.<br />
$css_bgcol_normal.';border:1px solid #aaa;padding:2px;">'."\n";<br />
<br />
$divider ='<span style="color:#888;">|</span>';<br />
<br />
$format = ''; # Enthält den Modul-Header des Patterns<br />
<br />
// Sequenz einlesen und zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
<br />
for ($j=0; $j<count($magic); $j++)<br />
if ($sequenz[$i] == $magic[$j])<br />
$format=$magic[$j];<br />
<br />
// wurde Header-String gefunden, brich schleife ab.<br />
if ($format) break;<br />
// sobald das erste |-Zeichen erscheint, ist es unwahscheinlich, dass<br />
// der Header danach noch kommt - also Suche abbrechen<br />
if (substr($sequenz[$i], 0, 1)=='|') break;<br />
}<br />
<br />
<br />
// Konnte Format nicht am Header erkannt werden,<br />
// wird nachgesehen, ob das "format"-Attribut angegeben wurde<br />
if ($format=='') {<br />
if ($attrib['format']>'') {<br />
switch ($attrib['format']) {<br />
case 'XM':<br />
$format=$magic[1];<br />
break;<br />
case 'MPT':<br />
case 'MPTM':<br />
$format=$magic[2];<br />
break;<br />
case 'S3M':<br />
$format=$magic[3];<br />
break;<br />
case 'MOD':<br />
$format=$magic[4];<br />
break;<br />
default: // IT<br />
$format=$magic[0];<br />
break;<br />
}<br />
}<br />
// Weder Header-String noch Format-Attribut übergeben.<br />
// Wir gehen dann vom IT-Format aus.<br />
else {<br />
$format=$magic[0];<br />
}<br />
}<br />
<br />
// Wurde header="aus" nicht übergeben, zeige Headerstring an<br />
if (!isset($attrib['header']) || strtolower($attrib['header']) != 'aus')<br />
$ret.='<span style="font:12px Courier;color:'.$color_note.'">'.<br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note (3 Zeichen: 1-3 (Zeichen 0: Divider |))<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument (2 Zeichen: 4-5)<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume (3 Zeichen: 6-8)<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt (3 Zeichen: 9-11)<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\:#])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
// Zeile wurde vollständig eingelesen, also $row inkrementieren<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
<br />
// Attribut takt="X": Alle X Zeilen hervorheben<br />
if (isset($attrib['takt']) && $attrib['takt']>0)<br />
$background = ($row % $attrib['takt']==0) ? $css_bgcol_highlight : '';<br />
<br />
# |<br />
$ret.= $divider;<br />
<br />
# Note<br />
$ret.= MPT_ConvData($data[$row][$channel]['note'],<br />
$color_note, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Instrument<br />
$ret.= MPT_ConvData($data[$row][$channel]['instr'],<br />
$color_instr, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Volume Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['vol'],<br />
MPT_EffectColor($data[$row][$channel]['vol'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Effect Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['eff'],<br />
MPT_EffectColor($data[$row][$channel]['eff'], $format, $attrib['farbe']),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
}<br />
// Jede Zeile mit einem Zeilenumbruch abschließen.<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div></div>'; # zwei geöffnete <div>-tags<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_IsValidColor()<br />
*<br />
* Prüft, ob ein übergebener Farbcode gültig ist.<br />
* Gültige Parameter sind nur #RrGgBb oder #RGB.<br />
* Ist Parameter nicht gültig, wird 0 zurückgegeben,<br />
* andernfalls 1.<br />
*/<br />
function MPT_IsValidColor($col) {<br />
if (preg_match("/^#[0-9A-Fa-f]{3}$/", $col) == 0)<br />
if (preg_match("/^#[0-9A-Fa-f]{6}$/", $col) == 0)<br />
return 0;<br />
<br />
return 1;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_ConvData()<br />
*<br />
* Funktion zum hinzufügen von style-Elementen in das<br />
* <span>-Tag. Das Tag selbst wird von MPT_Span() zurückgegeben.<br />
*/<br />
function MPT_ConvData(<br />
$dat, /* der Text selbst */<br />
$color, /* Schriftfarbe */<br />
$css_font, /* der Font */<br />
$css_fontweight, /* bold|normal */<br />
$css_padding_right, /* Größe der Lücke zwischen den Spalten */<br />
$background='' /* Hintergrund hervorgehobener Zeilen */<br />
)<br />
{<br />
return MPT_Span($dat,<br />
"color:$color;".<br />
(($css_font>'')<br />
? "font:$css_font;"<br />
: '') .<br />
(($css_fontweight>'')<br />
? "font-weight:$css_fontweight;"<br />
: '').<br />
(($css_padding_right>'')<br />
? "padding-right:$css_padding_right;"<br />
: '').<br />
(($background>'')<br />
? "background:$background;"<br />
: '')<br />
);<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Span()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
function MPT_Span($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_EffectColor($eff)<br />
*<br />
* Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
*/<br />
<br />
function MPT_EffectColor($eff, $format, $farbschema) {<br />
<br />
switch ($farbschema) {<br />
case 'MPT':<br />
$color_global = '#800000';<br />
$color_panning= '#008080';<br />
$color_volume = '#008000';<br />
$color_pitch = '#808000';<br />
$color_other = '#000';<br />
// für undefinierte/ungültige Befehle und leere Spalten<br />
$color_default= '#000';<br />
break;<br />
case 'FT2': // :-((((<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#ff0';<br />
$color_default= '#ff0';<br />
break;<br />
case 'IT':<br />
$color_global = '#ff4040';<br />
$color_panning= '#0ff';<br />
$color_volume = '#0f0';<br />
$color_pitch = '#ff0';<br />
$color_other = '#0f0';<br />
$color_default= '#0f0';<br />
break;<br />
default: // BUZZ<br />
$color_global = '#600';<br />
$color_panning= '#006868';<br />
$color_volume = '#005e00';<br />
$color_pitch = '#626200';<br />
$color_other = '#343a27';<br />
$color_default= '#000';<br />
break;<br />
}<br />
<br />
// Format: IT<br />
if ($format == 'ModPlug Tracker IT'<br />
|| $format == 'ModPlug Tracker MPT')<br />
{<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdvDKLMNR<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch efghuo:EFGHU<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: S3M<br />
elseif ($format == 'ModPlug Tracker S3M') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume vDKLMNR<br />
case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N':<br />
case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch EFGHU<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S':<br />
case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: XM<br />
elseif ($format == 'ModPlug Tracker XM') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDFGH<br />
case 'B': case 'D': case 'F': case 'G': case 'H':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle lpr8PY<br />
case 'l': case 'p': case 'r':<br />
case '8': case 'P': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdv567AC<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch ghu1234<br />
case 'g': case 'h': case 'u':<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09EKLRTZ<br />
case '0': case '9': case 'E': case 'K': case 'L':<br />
case 'R': case 'T':case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: MOD<br />
elseif ($format == 'ModPlug Tracker MOD') {<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDF<br />
case 'B': case 'D': case 'F':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle 8<br />
case '8':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume 567AC<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch 1234<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09E<br />
case '0': case '9': case 'E':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: nicht definiert (einfarbig)<br />
else {<br />
$color=$color_default;<br />
}<br />
<br />
return $color;<br />
}<br />
<br />
?><br />
</pre><br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=626
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-25T22:42:28Z
<p>Cubaxd: </p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns im Wiki. Die Darstellung aller von OpenMPT unterstützten Modulformate funktioniert inzwischen ziemlich gut. Auch das direkte Kopieren der Patterns in den Pattern-Editor sollte problemlos laufen.<br />
<br />
== Installation ==<br />
<br />
'''Bitte vorher nochmal den Code begutachten ;)'''<br />
<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen (für den Fall dass es mal mehr Dateien werden; womöglich kommt in der Zukunft noch eine css-Datei dazu (hoffentlich;))<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
'''Attribute:'''<br /><br />
* header="aus": Der Headerstring wird nicht angezeigt<br />
* format="IT/MPTM(Standard)|S3M|XM|MOD": Effekthervorhebung<br />
* takt="X": alle X Zeilen hervorheben<br />
* titel="beschreibung"<br />
* ausrichtung="links(Standard)|rechts"<br />
<br />
Wenn das Attribut ''header="aus"'' übergeben wird, wird der Headerstring nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
== Bekannte Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Das kann man derzeit höchstens mit &lt;br /&gt;-Tags umgehen. Gibt es da eine andere Lösung??<br />
<br />
* Wird das vom Internet Explorer ordentlich dargestellt?<br />
<br />
* Ich glaube, ich habe den Code komplizierter gemacht, als es nötig wäre. Aber er funktioniert ... irgendwie :-D<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich, dass der Code Bugs enthält, die ich übersehen habe, oder die für mich nicht offensichtlich sind, da ich mich sonst eigentlich nicht so intensiv mit PHP befasse :(.<br />
<br />
== Sourcecode ==<br />
<br />
MPTPatterns.php (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
©2009 cubaxd<br />
<br />
Version: 0.2b<br />
URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern [takt="X"] [header="aus"] [format="IT|XM|MPT(M)|S3M|MOD"] [titel="bla"] [ausrichtung="links|rechts]><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
Attribute:<br />
takt="X"<br />
alle X Zeilen hervorheben<br />
header="aus"<br />
Header-String nicht anzeigen<br />
format="IT/MPTM/* (Standard)|XM||S3M|MOD"<br />
Modulformat. Wird nur berücksichtigt, wenn der<br />
Headerstring nicht im Pattern vorkommt!<br />
titel="beschreibung"<br />
ausrichtung="links|rechts"<br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if( !defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die( -1 );<br />
}<br />
$wgExtensionFunctions[] = 'MPT_InitPatterns';<br />
<br />
// Initialisierungsfunktion<br />
function MPT_InitPatterns() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Pattern2HTML()<br />
*<br />
* Patterndaten einlesen und in HTML-Code einbetten<br />
*<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
<br />
// CSS-Daten<br />
// Die Farben für die Effekte sind in der Funktion<br />
// MPT_EffectColor() definiert.<br />
$color_note = '#00005b';<br />
$color_instr= '#005555';<br />
$css_font= '12px Courier';<br />
$css_fontweight='bold';<br />
$css_padding_right= '5px';<br />
$css_bgcol='#d1cac0'; # Hintergrundfarbe hervorgehobener Zeilen<br />
$css_bgcol_div='#e1dbd0'; # Hintergrundfarbe des <div>s<br />
<br />
// Der Ausgabebereich wird auf der linken oder der rechten Seite dargestellt<br />
$style_outer_div_left =<br />
'<div style="float:left;width:auto;margin-right:8px;padding:2px;'.<br />
'border:1px solid #aaa;background:#ddd;">';<br />
$style_outer_div_right =<br />
'<div style="float:right;width:auto;margin-left:8px;padding:2px;'.<br />
'border:1px solid #aaa;background:#ddd;">';<br />
<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
<br />
<br />
// enthält attribute, die an das tag übergeben werden<br />
$attrib=array();<br />
<br />
// Attribute einlesen<br />
if ( isset($args['titel']) ) {<br />
$titel =<br />
'<div style="width:auto;padding:2px;background-color:#dde;'.<br />
'border:1px solid #aaa;text-align:center;margin-bottom:2px;">'.<br />
htmlspecialchars($args['titel']).<br />
'</div>';<br />
}<br />
<br />
# ausrichtung<br />
if ( isset($args['ausrichtung']) ) {<br />
$seite = strtolower(htmlspecialchars($args['ausrichtung']));<br />
// Ausrichtung links als Standard, falls Wert ungültig<br />
if ($seite!='links' && $seite!='rechts')<br />
$seite = 'links';<br />
if ($seite=='links')<br />
$outer_div=$style_outer_div_left.$titel;<br />
else<br />
$outer_div=$style_outer_div_right.$titel;<br />
} else {<br />
$outer_div=$style_outer_div_left.$titel;<br />
}<br />
<br />
# takt<br />
if ( isset($args['takt'] ) && is_numeric( $args['takt'] ) )<br />
$attrib['takt'] = htmlspecialchars($args['takt']);<br />
else<br />
$attrib['takt'] = 0;<br />
<br />
# header<br />
if ( isset($args['header']) )<br />
$attrib['header'] = strtolower(htmlspecialchars($args['header']));<br />
<br />
#format<br />
if ( isset($args['format']) )<br />
$attrib['format'] = strtoupper(htmlspecialchars($args['format']));<br />
<br />
<br />
<br />
// $ret ist der String der alle Daten enthält, die zurückgegeben werden.<br />
$ret = $outer_div.'<div style="width:auto;background-color:'.<br />
$css_bgcol_div.';border:1px solid #aaa;padding:2px;">'."\n";<br />
<br />
$divider ='<span style="color:#888;">|</span>';<br />
<br />
$format = ''; # Enthält den Modul-Header des Patterns<br />
<br />
// Sequenz einlesen und zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
<br />
for ($j=0; $j<count($magic); $j++)<br />
if ($sequenz[$i] == $magic[$j])<br />
$format=$magic[$j];<br />
<br />
// wurde Header-String gefunden, brich schleife ab.<br />
if ($format) break;<br />
// sobald das erste |-Zeichen erscheint, ist es unwahscheinlich, dass<br />
// der Header danach noch kommt - also Suche abbrechen<br />
if (substr($sequenz[$i], 0, 1)=='|') break;<br />
}<br />
<br />
<br />
// Konnte Format nicht am Header erkannt werden,<br />
// wird nachgesehen, ob das "format"-Attribut angegeben wurde<br />
if ($format=='') {<br />
if ($attrib['format']>'') {<br />
switch ($attrib['format']) {<br />
case 'XM':<br />
$format=$magic[1];<br />
break;<br />
case 'S3M':<br />
$format=$magic[3];<br />
break;<br />
case 'MOD':<br />
$format=$magic[4];<br />
break;<br />
default: // IT, MPT<br />
$format=$magic[0];<br />
break;<br />
}<br />
}<br />
// Weder Header-String noch Format-Attribut übergeben.<br />
// Wir gehen dann vom IT-Format aus.<br />
else {<br />
$format=$magic[0];<br />
}<br />
}<br />
<br />
// Wurde header="aus" nicht übergeben, zeige Headerstring an<br />
if (!isset($attrib['header']) || strtolower($attrib['header']) != 'aus')<br />
$ret.='<span style="font:12px Courier;">'.preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note (3 Zeichen: 1-3 (Zeichen 0: Divider |))<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument (2 Zeichen: 4-5)<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume (3 Zeichen: 6-8)<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt (3 Zeichen: 9-11)<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\:#])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
// Zeile wurde vollständig eingelesen, also $row inkrementieren<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
<br />
// Attribut takt="X": Alle X Zeilen hervorheben<br />
if (isset($attrib['takt']) && $attrib['takt']>0)<br />
$background = ($row % $attrib['takt']==0) ? $css_bgcol : '';<br />
<br />
# |<br />
$ret.= $divider;<br />
<br />
# Note<br />
$ret.= MPT_ConvData($data[$row][$channel]['note'],<br />
$color_note, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Instrument<br />
$ret.= MPT_ConvData($data[$row][$channel]['instr'],<br />
$color_instr, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Volume Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['vol'],<br />
MPT_EffectColor($data[$row][$channel]['vol'], $format),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Effect Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['eff'],<br />
MPT_EffectColor($data[$row][$channel]['eff'], $format),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
}<br />
// Jede Zeile mit einem Zeilenumbruch abschließen.<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div></div>'; # zwei geöffnete <div>-tags<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_ConvData()<br />
*<br />
* Funktion zum hinzufügen von style-Elementen in das<br />
* <span>-Tag. Das Tag selbst wird von MPT_Span() zurückgegeben.<br />
*/<br />
function MPT_ConvData(<br />
$dat, /* der Text selbst */<br />
$color, /* Schriftfarbe */<br />
$css_font, /* der Font */<br />
$css_fontweight, /* bold|normal */<br />
$css_padding_right, /* Größe der Lücke zwischen den Spalten */<br />
$background='' /* Hintergrund hervorgehobener Zeilen */<br />
)<br />
{<br />
return MPT_Span($dat,<br />
"color:$color;".<br />
(($css_font>'')<br />
? "font:$css_font;"<br />
: '') .<br />
(($css_fontweight>'')<br />
? "font-weight:$css_fontweight;"<br />
: '').<br />
(($css_padding_right>'')<br />
? "padding-right:$css_padding_right;"<br />
: '').<br />
(($background>'')<br />
? "background:$background;"<br />
: '')<br />
);<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Span()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
function MPT_Span($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_EffectColor($eff)<br />
*<br />
* Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
*/<br />
<br />
function MPT_EffectColor($eff, $format) {<br />
<br />
$color_global = '#660000';<br />
$color_panning= '#006868';<br />
$color_volume = '#005e00';<br />
$color_pitch = '#626200';<br />
$color_other = '#343a27';<br />
$color_default= '#000000';<br />
<br />
// Format: IT<br />
if ($format == 'ModPlug Tracker IT'<br />
|| $format == 'ModPlug Tracker MPT')<br />
{<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdvDKLMNR<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch efghuo:EFGHU<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
$color=$color_other;<br />
break;<br />
<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: S3M<br />
elseif ($format == 'ModPlug Tracker S3M') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume vDKLMNR<br />
case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N':<br />
case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch EFGHU<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S':<br />
case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: XM<br />
elseif ($format == 'ModPlug Tracker XM') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDFGH<br />
case 'B': case 'D': case 'F': case 'G': case 'H':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle lpr8PY<br />
case 'l': case 'p': case 'r':<br />
case '8': case 'P': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdv567AC<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch ghu1234<br />
case 'g': case 'h': case 'u':<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09EKLRTZ<br />
case '0': case '9': case 'E': case 'K': case 'L':<br />
case 'R': case 'T':case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: MOD<br />
elseif ($format == 'ModPlug Tracker MOD') {<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDF<br />
case 'B': case 'D': case 'F':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle 8<br />
case '8':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume 567AC<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch 1234<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09E<br />
case '0': case '9': case 'E':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: nicht definiert (einfarbig)<br />
else {<br />
$color=$color_default;<br />
}<br />
<br />
return $color;<br />
}<br />
<br />
?><br />
</pre><br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" format="IT"><br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=625
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-25T22:00:51Z
<p>Cubaxd: </p>
<hr />
<div>{{Navi Werkstatt}}<br />
Diese Erweiterung dient der originalgetreuen Darstellung von OpenMPT-Patterns im Wiki. Die Darstellung aller von OpenMPT unterstützten Modulformate funktioniert inzwischen ziemlich gut. Auch das direkte Kopieren der Patterns in den Pattern-Editor sollte problemlos laufen.<br />
<br />
== Installation ==<br />
<br />
'''Bitte vorher nochmal den Code begutachten ;)'''<br />
<br />
* Ordner <code>extensions/MPTPatterns</code> anlegen (für den Fall dass es mal mehr Dateien werden; womöglich kommt in der Zukunft noch eine css-Datei dazu (hoffentlich;))<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" header="aus"><br />
ModPlug Tracker IT<br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern><br />
</pre><br />
<br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
'''Attribute:'''<br /><br />
* header="aus": Der Headerstring wird nicht angezeigt<br />
* format="IT/MPTM(Standard)|S3M|XM|MOD": Effekthervorhebung<br />
* takt="X": alle X Zeilen hervorheben<br />
* titel="beschreibung"<br />
* ausrichtung="links(Standard)|rechts"<br />
<br />
Wenn das Attribut ''header="aus"'' übergeben wird, wird der Headerstring nicht angezeigt. Der Nachteil dabei ist, dass OpenMPT dann nicht in der Lage ist, die kopierte Sequenz in ein anderes Format zu konvertieren. Sollte also z.B. ein Pattern, das im Wiki im IT-Format vorliegt, in den Pattern-Editor kopiert werden, wo gerade ein XM-Modul geöffnet ist, werden die Daten des Patterns nicht an das XM-Format angepasst.<br />
<br />
Das Attribut ''format'' wird nur berücksichtigt, wenn der Headerstring selbst im Pattern nicht vorkommt. In diesem Fall sollte dieses Attribut benutzt werden, sofern es sich nicht um eine Sequenz aus einem IT/MPTM-Modul handelt. Vom IT-Format wird nämlich standardmäßig ausgegangen.<br />
<br />
== Bekannte Probleme ==<br />
* Durch die vielen &lt;span&gt;-Tags und die darin enthaltenen Style-Elemente wird der HTML-Code, je nach Größe des Patterns, sehr groß. Es sollte eine spezielle CSS-Datei eingebunden werden, wenn ein Pattern-Tag benutzt wird, sodass nur noch die entsprechenden Klassen angegeben werden müssen, anstatt die Elemente jedesmal direkt mit in den Code zu übernehmen. Das werde ich eventuell nachholen, sobald ich die MediaWiki-Materie etwas besser begreife ;).<br />
<br />
* Ist der Titel zu lang, verbreitert sich auch der gesamte Bereich. Das kann man derzeit höchstens mit &lt;br /&gt;-Tags umgehen. Gibt es da eine andere Lösung??<br />
<br />
* Wird das vom Internet Explorer ordentlich dargestellt?<br />
<br />
* Ich glaube, ich habe den Code komplizierter gemacht, als es nötig wäre. Aber er funktioniert ... irgendwie :-D<br />
<br />
* Ansonsten ist es selbstverständlich auch möglich, dass der Code Bugs enthält, die ich übersehen habe, oder die für mich nicht offensichtlich sind, da ich mich sonst eigentlich nicht so intensiv mit PHP befasse :(.<br />
<br />
== Sourcecode ==<br />
<br />
MPTPatterns.php (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
©2009 cubaxd<br />
<br />
Version: 0.2b<br />
URL: http://sagamusix.de/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern [takt="X"] [header="aus"] [format="IT|XM|MPT(M)|S3M|MOD"] [titel="bla"] [ausrichtung="links|rechts]><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
Attribute:<br />
takt="X"<br />
alle X Zeilen hervorheben<br />
header="aus"<br />
Header-String nicht anzeigen<br />
format="IT/MPTM/* (Standard)|XM||S3M|MOD"<br />
Modulformat. Wird nur berücksichtigt, wenn der<br />
Headerstring nicht im Pattern vorkommt!<br />
titel="beschreibung"<br />
ausrichtung="links|rechts"<br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if( !defined( 'MEDIAWIKI' ) ) {<br />
echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );<br />
die( -1 );<br />
}<br />
$wgExtensionFunctions[] = 'MPT_InitPatterns';<br />
<br />
// Initialisierungsfunktion<br />
function MPT_InitPatterns() {<br />
global $wgParser;<br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Pattern2HTML()<br />
*<br />
* Patterndaten einlesen und in HTML-Code einbetten<br />
*<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
<br />
// CSS-Daten<br />
// Die Farben für die Effekte sind in der Funktion<br />
// MPT_EffectColor() definiert.<br />
$color_note = '#00005b';<br />
$color_instr= '#005555';<br />
$css_font= '12px Courier';<br />
$css_fontweight='bold';<br />
$css_padding_right= '5px';<br />
$css_bgcol='#d1cac0'; # Hintergrundfarbe hervorgehobener Zeilen<br />
$css_bgcol_div='#e1dbd0'; # Hintergrundfarbe des <div>s<br />
<br />
// Der Ausgabebereich wird auf der linken oder der rechten Seite dargestellt<br />
$style_outer_div_left =<br />
'<div style="float:left;width:auto;margin-right:8px;padding:2px;'.<br />
'border:1px solid #aaa;background:#ddd;">';<br />
$style_outer_div_right =<br />
'<div style="float:right;width:auto;margin-left:8px;padding:2px;'.<br />
'border:1px solid #aaa;background:#ddd;">';<br />
<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
<br />
<br />
// enthält attribute, die an das tag übergeben werden<br />
$attrib=array();<br />
<br />
// Attribute einlesen<br />
if ( isset($args['titel']) ) {<br />
$titel =<br />
'<div style="width:auto;padding:2px;background-color:#dde;'.<br />
'border:1px solid #aaa;text-align:center;margin-bottom:2px;">'.<br />
htmlspecialchars($args['titel']).<br />
'</div>';<br />
}<br />
<br />
# ausrichtung<br />
if ( isset($args['ausrichtung']) ) {<br />
$seite = strtolower(htmlspecialchars($args['ausrichtung']));<br />
// Ausrichtung links als Standard, falls Wert ungültig<br />
if ($seite!='links' && $seite!='rechts')<br />
$seite = 'links';<br />
if ($seite=='links')<br />
$outer_div=$style_outer_div_left.$titel;<br />
else<br />
$outer_div=$style_outer_div_right.$titel;<br />
} else {<br />
$outer_div=$style_outer_div_left.$titel;<br />
}<br />
<br />
# takt<br />
if ( isset($args['takt'] ) && is_numeric( $args['takt'] ) )<br />
$attrib['takt'] = htmlspecialchars($args['takt']);<br />
else<br />
$attrib['takt'] = 0;<br />
<br />
# header<br />
if ( isset($args['header']) )<br />
$attrib['header'] = strtolower(htmlspecialchars($args['header']));<br />
<br />
#format<br />
if ( isset($args['format']) )<br />
$attrib['format'] = strtoupper(htmlspecialchars($args['format']));<br />
<br />
<br />
<br />
// $ret ist der String der alle Daten enthält, die zurückgegeben werden.<br />
$ret = $outer_div.'<div style="width:auto;background-color:'.<br />
$css_bgcol_div.';border:1px solid #aaa;padding:2px;">'."\n";<br />
<br />
$divider ='<span style="color:#888;">|</span>';<br />
<br />
$format = ''; # Enthält den Modul-Header des Patterns<br />
<br />
// Sequenz einlesen und zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
for ($j=0; $j<count($magic); $j++) {<br />
if ($sequenz[$i] == $magic[$j]) {<br />
$format=$magic[$j];<br />
if (strtolower($attrib['header']) != 'aus')<br />
$ret.='<span style="font:12px Courier;">' .<br />
preg_replace('/ /', '&nbsp;', $format) . "</span><br />\n";<br />
}<br />
}<br />
// wurde Header-String gefunden, brich schleife ab.<br />
if ($format) break;<br />
// sobald das erste |-Zeichen erscheint, ist es unwahscheinlich, dass<br />
// der Header danach noch kommt - also Suche abbrechen<br />
if (substr($sequenz[$i], 0, 1)=='|') break;<br />
}<br />
<br />
<br />
// Konnte Format nicht am Header erkannt werden,<br />
// wird nachgesehen, ob das "format"-Attribut angegeben wurde<br />
if ($format=='') {<br />
if ($attrib['format']>'') {<br />
switch ($attrib['format']) {<br />
case 'XM':<br />
$format=$magic[1];<br />
break;<br />
case 'S3M':<br />
$format=$magic[3];<br />
break;<br />
case 'MOD':<br />
$format=$magic[4];<br />
break;<br />
default: // IT, MPT<br />
$format=$magic[0];<br />
break;<br />
}<br />
}<br />
// Weder Header-String noch Format-Attribut übergeben.<br />
// Wir gehen dann vom IT-Format aus.<br />
else {<br />
$format=$magic[0];<br />
}<br />
}<br />
<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note (3 Zeichen: 1-3 (Zeichen 0: Divider |))<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument (2 Zeichen: 4-5)<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume (3 Zeichen: 6-8)<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt (3 Zeichen: 9-11)<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z\\:#])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
// Zeile wurde vollständig eingelesen, also $row inkrementieren<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
<br />
// Attribut takt="X": Alle X Zeilen hervorheben<br />
if (isset($attrib['takt']) && $attrib['takt']>0)<br />
$background = ($row % $attrib['takt']==0) ? $css_bgcol : '';<br />
<br />
# |<br />
$ret.= $divider;<br />
<br />
# Note<br />
$ret.= MPT_ConvData($data[$row][$channel]['note'],<br />
$color_note, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Instrument<br />
$ret.= MPT_ConvData($data[$row][$channel]['instr'],<br />
$color_instr, $css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Volume Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['vol'],<br />
MPT_EffectColor($data[$row][$channel]['vol'], $format),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
<br />
# Effect Column<br />
$ret.= MPT_ConvData($data[$row][$channel]['eff'],<br />
MPT_EffectColor($data[$row][$channel]['eff'], $format),<br />
$css_font, $css_fontweight, $css_padding_right, $background);<br />
}<br />
// Jede Zeile mit einem Zeilenumbruch abschließen.<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div></div>'; # zwei geöffnete <div>-tags<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_ConvData()<br />
*<br />
* Funktion zum hinzufügen von style-Elementen in das<br />
* <span>-Tag. Das Tag selbst wird von MPT_Span() zurückgegeben.<br />
*/<br />
function MPT_ConvData(<br />
$dat, /* der Text selbst */<br />
$color, /* Schriftfarbe */<br />
$css_font, /* der Font */<br />
$css_fontweight, /* bold|normal */<br />
$css_padding_right, /* Größe der Lücke zwischen den Spalten */<br />
$background='' /* Hintergrund hervorgehobener Zeilen */<br />
)<br />
{<br />
return MPT_Span($dat,<br />
"color:$color;".<br />
(($css_font>'')<br />
? "font:$css_font;"<br />
: '') .<br />
(($css_fontweight>'')<br />
? "font-weight:$css_fontweight;"<br />
: '').<br />
(($css_padding_right>'')<br />
? "padding-right:$css_padding_right;"<br />
: '').<br />
(($background>'')<br />
? "background:$background;"<br />
: '')<br />
);<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_Span()<br />
* Funktion zum Einbetten der Daten in <span>-Tags.<br />
*/<br />
function MPT_Span($dat, $style) {<br />
return '<span style="'.$style.'">'.$dat.'</span>';<br />
}<br />
<br />
/**-----------------------------------------------<br />
* MPT_EffectColor($eff)<br />
*<br />
* Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
*/<br />
<br />
function MPT_EffectColor($eff, $format) {<br />
<br />
$color_global = '#660000';<br />
$color_panning= '#006868';<br />
$color_volume = '#005e00';<br />
$color_pitch = '#626200';<br />
$color_other = '#343a27';<br />
$color_default= '#000000';<br />
<br />
// Format: IT<br />
if ($format == 'ModPlug Tracker IT'<br />
|| $format == 'ModPlug Tracker MPT')<br />
{<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdvDKLMNR<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch efghuo:EFGHU<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
$color=$color_other;<br />
break;<br />
<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: S3M<br />
elseif ($format == 'ModPlug Tracker S3M') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle ABCTVW<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle pPXY<br />
case 'p':<br />
case 'P': case 'X': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume vDKLMNR<br />
case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N':<br />
case 'R':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch EFGHU<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges IJOQSZ<br />
case 'I': case 'J': case 'O': case 'Q': case 'S':<br />
case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: XM<br />
elseif ($format == 'ModPlug Tracker XM') {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDFGH<br />
case 'B': case 'D': case 'F': case 'G': case 'H':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle lpr8PY<br />
case 'l': case 'p': case 'r':<br />
case '8': case 'P': case 'Y':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume abcdv567AC<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch ghu1234<br />
case 'g': case 'h': case 'u':<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09EKLRTZ<br />
case '0': case '9': case 'E': case 'K': case 'L':<br />
case 'R': case 'T':case 'Z': case '\\': case '#':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: MOD<br />
elseif ($format == 'ModPlug Tracker MOD') {<br />
switch (substr($eff, 0, 1)) {<br />
<br />
// globale Befehle BDF<br />
case 'B': case 'D': case 'F':<br />
$color=$color_global;<br />
break;<br />
<br />
// Panningbefehle 8<br />
case '8':<br />
$color=$color_panning;<br />
break;<br />
<br />
// Volume 567AC<br />
case '5': case '6': case '7': case 'A': case 'C':<br />
$color=$color_volume;<br />
break;<br />
<br />
// Pitch 1234<br />
case '1': case '2': case '3': case '4':<br />
$color=$color_pitch;<br />
break;<br />
<br />
// Sonstiges 09E<br />
case '0': case '9': case 'E':<br />
$color=$color_other;<br />
break;<br />
default:<br />
$color=$color_default;<br />
break;<br />
}<br />
}<br />
<br />
// Format: nicht definiert (einfarbig)<br />
else {<br />
$color=$color_default;<br />
}<br />
<br />
return $color;<br />
}<br />
<br />
?><br />
<br />
</pre><br />
<br />
== Test ==<br />
<pattern takt="4" ausrichtung="rechts" titel="Ein Beispiel" header="aus"><br />
ModPlug Tracker IT<br />
|C-604...Q01|A#501...XE0|C-602p48A04|G-508v24T70<br />
|........Q..|...........|...........|...........<br />
|........Q..|...........|C-603p24...|...........<br />
|........Q..|...........|...........|...........<br />
|===........|...........|C-602p08...|D#708v32O10<br />
|...........|...........|...........|...........<br />
|...........|C-501......|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
|...........|A#501...S9F|C-602p48...|A-608......<br />
|...........|...........|...........|...........<br />
|...........|...........|C-603p24...|...........<br />
|...........|...........|...........|...........<br />
</pattern></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Vorlage:Navi_Werkstatt&diff=621
Vorlage:Navi Werkstatt
2009-01-23T17:43:35Z
<p>Cubaxd: Die Seite wurde neu angelegt: <div style="border:1px solid #aac; background:#dde; float:right; width:100px; margin-left:8px;"> <center>'''Werkstatt'''</center> </div></p>
<hr />
<div><div style="border:1px solid #aac; background:#dde; float:right; width:100px; margin-left:8px;"><br />
<center>'''[[OpenMPT Wiki:Werkstatt|Werkstatt]]'''</center><br />
</div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt/MPTPatterns&diff=620
OpenMPT-Wiki:Werkstatt/MPTPatterns
2009-01-23T17:43:13Z
<p>Cubaxd: Die Seite wurde neu angelegt: {{Navi Werkstatt}} Ich hab mir überlegt, eine Erweiterung für das Wiki zu schreiben, so dass man Patterns nicht noch extra bearbeiten muss, wenn sie zum Wiki hinzugef...</p>
<hr />
<div>{{Navi Werkstatt}}<br />
Ich hab mir überlegt, eine Erweiterung für das Wiki zu schreiben, so dass man Patterns nicht noch extra bearbeiten muss, wenn sie zum Wiki hinzugefügt werden. Die grundlegenden Dinge funktionieren ja schonmal ganz gut. Also z.B. die Hervorhebung. Aber irgendwie ist das ganze Teil nicht zufriedenstellend und ich bewege mich nur im Kreis, wenn ich was hinzufügen will :-D. Ich hab derzeit keinen Plan, wie ich weiter vorgehen soll. Ich werde das Ding bestimmt später weiterschreiben. Bis dahin stell ich es hier ein, für den Fall, dass du an der Erweiterung weiterhäkeln oder von mir aus auch ganz neu stricken willst ;).<br />
<br />
--[[Benutzer:Cubaxd|Cubaxd]] 17:43, 23. Jan. 2009 (UTC)<br />
<br />
== Installation ==<br />
'''Warnung: Alpha!!!'''<br />
<br />
* Ordner <code>extensions/MPTPatternHighlight</code> anlegen (für den Fall dass es mal mehr Dateien werden)<br />
* <code>[[#Sourcecode|MPTPatterns.php]]</code> in <code>extensions/MPTPatterns</code> speichern<br />
* <code>LocalSettings.php</code> ganz unten folgende Zeile hinzufügen:<br />
require_once("extensions/MPTPatterns/MPTPatterns.php");<br />
<br />
== Benutzung ==<br />
Benutzt wird die Erweiterung momentan so:<br />
<pre><br />
<pattern><br />
ModPlug Tracker IT<br />
|D#662b01H61|.....b01H..|.....b01H..<br />
|........H..|.....b01H..|........H..<br />
|........H..|.....b01H..|........H..<br />
|........H..|.....b01H..|........H..<br />
</pattern><br />
</pre><br />
Die Effekte werden genauso wie in OpenMPT hervorgehoben, je nach Kategorie.<br />
<br />
Das wäre dann auch 1000 mal leichter, als für jedes Pattern übelste akrobatische Kunststücke auf der Tastatur machen zu müssen.<br />
<pre><br />
<span style="font: 12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq|D#6|62|b01|H61}}{{seq|...|..|b01|H00}}{{seq|...|..|b01|H00}}<br /><br />
{{seq|...|..|...|H00}}{{seq|...|..|b01|H00}}{{seq|...|..|...|H00}}<br /><br />
{{seq|...|..|...|H00}}{{seq|...|..|b01|H00}}{{seq|...|..|...|H00}}<br /><br />
{{seq|...|..|...|H00}}{{seq|...|..|b01|H00}}{{seq|...|..|...|H00}}<br /><br />
</pre><br />
<br />
Aber wie gesagt: Die Erweiterung ist derzeit nur begrenzt nützlich.<br />
<br />
== Ideen ==<br />
=== Attribute ===<br />
* header="aus": Der Headerstring wird nicht angezeigt<br />
* format="IT|S3M|XM|MOD": Effekthervorhebung; derzeit nur IT!<br />
* takt="X": alle X Zeilen hervorheben<br />
* titel="tofubar" Überschrift<br />
<br />
== Sourcecode ==<br />
<br />
MPTPatterns.php (bitte aktuell halten;))<br />
<pre><br />
<?php<br />
/*<br />
MPTPatterns<br />
MediaWiki-Erweiterung<br />
<br />
©2009 cubaxd<br />
<br />
URL: http://sagamusix/openmpt/OpenMPT_Wiki:Werkstatt/MPTPatterns<br />
Lizenz: GNU General Public License 3<br />
<br />
Benutzung:<br />
<pattern><br />
[Aus OpenMPT kopierte Sequenz]<br />
...<br />
</pattern><br />
<br />
*/<br />
<br />
// Nur vom MediaWiki ausführbar<br />
if(!defined( 'MEDIAWIKI')) die(1);<br />
<br />
$wgExtensionFunctions[] = 'MPT_InitPatterns';<br />
<br />
// Initialisierungsfunktion<br />
function MPT_InitPatterns() {<br />
global $wgParser;<br />
// Tag <pattern><br />
$wgParser->setHook('pattern', 'MPT_Pattern2HTML');<br />
return true;<br />
}<br />
<br />
/**<br />
MPT_Pattern2HTML()<br />
<br />
Patterndaten einlesen und in HTML-Code einbetten<br />
<br />
*/<br />
function MPT_Pattern2HTML($input, $args, $parser)<br />
{<br />
// $magic derzeit ungenutzt<br />
$magic= array (<br />
'ModPlug Tracker IT',<br />
'ModPlug Tracker XM',<br />
'ModPlug Tracker MPT',<br />
'ModPlug Tracker S3M',<br />
'ModPlug Tracker MOD');<br />
<br />
$ret = '<div style="width:auto;background-color:#ddd;font:12px courier;">'."\n";<br />
$divider ='<span style="color:#888;">|</span>';<br />
$format = '';<br />
<br />
// Sequenz zeilenweise splitten<br />
$sequenz=split("\n", htmlspecialchars($input));<br />
<br />
// HeaderString einlesen, falls vorhanden<br />
for ($i=0; $i<count($sequenz); $i++) {<br />
for ($j=0; $j<count($magic); $j++) {<br />
if ($sequenz[$i] == $magic[$j]) {<br />
$format=$magic[$j];<br />
$ret.=$format . "<br />\n";<br />
}<br />
}<br />
if ($format) break;<br />
}<br />
<br />
$row = 0;<br />
// Zeilen einlesen<br />
// $zeile ist Zeile im Input-Array $sequenz<br />
// $row ist eine Zeile im Output-Array $data<br />
for ($zeile=0; $zeile<count($sequenz); $zeile++) {<br />
<br />
// Zeilen mit Länge <12 und/oder Zeilen die nicht mit '|' beginnen werden ausgelassen<br />
if ( (strlen($sequenz[$zeile]) >= 12 )<br />
&& (substr($sequenz[$zeile], 0, 1) == '|') )<br />
{<br />
// Spalten bearbeiten in 12-Byte-Blöcken ($char)<br />
// also 12 Bytes je Kanal<br />
for ($char=0, $channel=0;<br />
$char<strlen($sequenz[$zeile]);<br />
$char+=12, $channel++)<br />
{<br />
# Note<br />
$data[$row][$channel]['note'] = substr($sequenz[$zeile], $char+1, 3);<br />
# Instrument<br />
$data[$row][$channel]['instr'] = substr($sequenz[$zeile], $char+4, 2);<br />
# Volume<br />
$data[$row][$channel]['vol'] = substr($sequenz[$zeile], $char+6, 3);<br />
# Effekt<br />
$data[$row][$channel]['eff'] =<br />
ereg_replace('^([0-9A-Z])\.\.', '\100', substr($sequenz[$zeile], $char+9, 3));<br />
}<br />
$row++;<br />
}<br />
}<br />
<br />
// $data-Array HTML-kodiert zusammenfügen<br />
for ($row=0; $row<count($data); $row++) {<br />
for ($channel=0; $channel<count($data[$row]); $channel++) {<br />
# |<br />
$ret.= $divider;<br />
# Note<br />
$ret.=<br />
'<span style="color:#00005b;margin-right:3px;">'.<br />
$data[$row][$channel]['note'].<br />
'</span>';<br />
# Instrument<br />
$ret.=<br />
'<span style="color:#005555;margin-right:3px;">'.<br />
$data[$row][$channel]['instr'].<br />
'</span>';<br />
# Volume<br />
$ret.= MPT_EffectColor($data[$row][$channel]['vol']);<br />
# Effekt<br />
$ret.= MPT_EffectColor($data[$row][$channel]['eff']);<br />
}<br />
$ret.="<br />\n";<br />
}<br />
<br />
return $ret . '</div>';<br />
}<br />
<br />
/**<br />
MPT_EffectColor($eff)<br />
<br />
Gibt die Effektfarbe für einen bestimmten Befehl zurück.<br />
TODO Derzeit nur IT-Format<br />
*/<br />
<br />
function MPT_EffectColor($eff) {<br />
<br />
switch (substr($eff, 0, 1)) {<br />
// globale Befehle<br />
case 'A': case 'B': case 'C': case 'T': case 'V': case 'W':<br />
$color='#660000';<br />
break;<br />
<br />
// Panningbefehle<br />
case 'p': case 'P': case 'X': case 'Y':<br />
$color='#006868';<br />
break;<br />
<br />
case 'a': case 'b': case 'c': case 'd': case 'v':<br />
case 'D': case 'K': case 'L': case 'M': case 'N': case 'R':<br />
$color='#005e00';<br />
break;<br />
<br />
case 'e': case 'f': case 'g': case 'h': case 'u': case 'o': case ':':<br />
case 'E': case 'F': case 'G': case 'H': case 'U':<br />
$color='#626200';<br />
break;<br />
<br />
case 'I': case 'J': case 'O': case 'Q': case 'S': case 'Z':<br />
$color='#343a27';<br />
break;<br />
<br />
default:<br />
$color='#000000';<br />
break;<br />
}<br />
<br />
return '<span style="color:'.$color.'; margin-right:3px;">'.$eff.'</span>';<br />
}<br />
<br />
?><br />
</pre></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Werkstatt&diff=619
OpenMPT-Wiki:Werkstatt
2009-01-23T17:41:22Z
<p>Cubaxd: Die Seite wurde neu angelegt: '''Hier wird an Erweiterungen für das Wiki gebastelt.''' * MPTPatterns: Erweiterung für das einfachere Hinzufügen von Pattern...</p>
<hr />
<div>'''Hier wird an Erweiterungen für das Wiki gebastelt.'''<br />
<br />
* [[OpenMPT Wiki:Werkstatt/MPTPatterns|MPTPatterns]]: Erweiterung für das einfachere Hinzufügen von Patterns in das Wiki und die originalgetreue Darstellung der Patternsequenzen.</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=OpenMPT-Wiki:Gemeinschafts-Portal&diff=618
OpenMPT-Wiki:Gemeinschafts-Portal
2009-01-23T17:40:58Z
<p>Cubaxd: Die Seite wurde neu angelegt: {| cellpadding="2" cellspacing="0" style="width:100%;background-color:transparent;" | valign="top" style="width:50%;" | <div style="background-color:transparent;border...</p>
<hr />
<div>{| cellpadding="2" cellspacing="0" style="width:100%;background-color:transparent;"<br />
| valign="top" style="width:50%;" |<br />
<div style="background-color:transparent;border:1px solid #679; margin-bottom:5px;"><br />
<div style="background-color:#dde;text-align:center;border-bottom:1px solid #679;padding:1px;padding-bottom:0px;">'''[[OpenMPT Wiki:Werkstatt|Werkstatt]]'''</div><br />
<div style="overflow:auto;padding:.6em;"><br />
<br />
* [[OpenMPT Wiki:Werkstatt/MPTPatterns|MPTPatterns]]: Erweiterung für das einfachere Hinzufügen von Patterns<br />
<br />
</div><br />
</div><br />
|}</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Panbrello&diff=616
Panbrello
2009-01-22T16:01:16Z
<p>Cubaxd: Weiterleitung nach Panning#Panbrello erstellt</p>
<hr />
<div>#redirect [[Panning#Panbrello]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Handbuch:_Installation&diff=615
Handbuch: Installation
2009-01-22T15:58:52Z
<p>Cubaxd: /* Shell-Skript */</p>
<hr />
<div>{{Handbuch TOC}}<br />
<br />
{{Hinweis|Aktuelle Versionen:|Im [http://modplug.svn.sourceforge.net/viewvc/modplug/trunk/OpenMPT/mptrack/bin/ SVN-Verzeichnis] bei SourceForge kannst du die jeweils neuesten Testbuilds runterladen. Dies ist die aktuelle Version von OpenMPT. Beachte aber, dass diese Versionen unter Umständen Fehler enthalten! Die derzeitige Version 1.17.02.52 läuft allerdings recht stabil.}}<br />
<br />
<br />
== Windows ==<br />
Benötigt wird natürlich einen Windows-PC (am besten Windows 98 oder neuer). Auch ein schneller Prozessor und eine gute Soundkarte können nicht schaden. Auf [http://sourceforge.net/project/showfiles.php?group_id=100385&package_id=230830 SourceForge] kann das neueste "Development Build" von OpenMPT heruntergeladen werden. Ist das Archiv heruntergeladen, können die darin enthalten Dateien in ein beliebiges, vorher erstelltes Verzeichnis kopiert werden. Direkt nach dem Entpacken ist das Programm quasi schon installiert und kann nun ausgeführt werden.<br />
<br />
{{Hinweis|Portabel:|Da keine Installation im eigentlichen Sinne notwendig ist, bzw. da keine Einträge in der Windows-Registry notwendig sind, kann OpenMPT problemlos auch von externen Datenträgern wie z.B. von USB-Sticks gestartet werden.}}<br />
<br />
Um eine Verknüpfung auf dem Desktop zu erstellen geht man wie folgt vor:<br />
# Datei <code>mptrack.exe</code> mit der rechten Maustaste anklicken<br />
# im darauf erscheindenden Menü <code>"Senden an" → "Desktop (Verknüpfung erstellen)"</code> auswählen<br />
Jetzt kann das Programm jederzeit vom Desktop aus gestartet werden.<br />
<br />
<br />
== Wine ==<br />
{{Hinweis|Hinweis|Wenn im Folgenden von Linux die Rede ist, schließt dies auch ähnliche Systeme ein, für die Wine verfügbar ist und die auf einem Intel-Rechner laufen (*BSD, Solaris, ...)}}<br />
<br />
Eine Linux-Version von OpenMPT ist derzeit offiziell nicht geplant. Das Programm kann aber dank [http://winehq.org/ Wine] dennoch genutzt werden.<br />
<br />
Benötigt wird Wine (ab Version 0.9.41), ein Linux-System (Wobei hier auch die Rechnerarchitektur eine Rolle spielt. Wie der Name von Wine es schon andeutet: '''W'''ine '''I'''s '''N'''ot an '''E'''mulator (Wine ist kein Emulator) - und daher laufen Windows-Programme auch nur auf Intel-kompatiblen Rechnern.) und natürlich OpenMPT. Bei älteren Versionen von Wine stürzt OpenMPT ab, sobald man versucht, einen Ton abzuspielen. Außerdem wird die Datei <code>winhttp.dll</code> benötigt (diese bekommt man aus einem existierenden Windows-System (<code>%WINDIR%\system32\winhttp.dll</code>) oder z. B. bei DllDump.com). Die Datei sollte dann nach <code>~/.wine/drive_c/windows/system32/</code> oder in das OpenMPT-Verzeichnis kopiert werden.<br />
<br />
Nachdem man Wine installiert hat, wechselt man in einer Shell in das Verzeichnis, in dem OpenMPT installiert ist und gibt folgende Zeile ein (ohne das $):<br />
$ wine mptrack.exe<br />
Dies sollte das Programm eigentlich starten, sofern<br />
* du im richtigen Verzeichnis bist.<br />
* keine Fehlermeldungen kommen (an denen man in der Regel auch sehen kann, '''was''' nicht funktioniert).<br />
<br />
<br />
{{Hinweis|Tipps zur Fehlerbehebung:|Treten im Betrieb mit Wine Probleme auf, ist evtl. die generische, d.h., die nicht für einen bestimmten Prozessortyp optimierte Ausgabe von OpenMPT der optimierten Variante vorzuziehen. So habe ich OpenMPT generic 1.17.02.28 (1.17RC2) mit Wine 1.0-rc3 unter openSUSE 11.0 Kernel-Version 2.6.25.16-0.1-pae erfolgreich getestet. Einzig bei hoher CPU-Last durch andere Anwendungen geht der Klang verloren, was sich jedoch durch Mausklick auf die PAUSE/PLAY-Taste beheben lässt. Die AMD-optimierte Variante hingegen ist unter diesen Bedingungen abgestürzt (Die Grafikoberfläche der Anwendung verschwindet, während das Stück weiterhin hörbar ist und OpenMPT manuell beendet werden muss, sprich mittels kill-Kommando).}}<br />
<br />
=== Shell-Skript ===<br />
Dieses Skript kann zum Ausführen von OpenMPT verwendet werden. Einfach den Text unten kopieren und mit einem Texteditor z.B. unter dem Namen <code>modplug</code> speichern. Danach mit <br />
chmod 755 modplug<br />
die Datei global lesbar und ausführbar machen und z.B. als root in das Verzeichnis <code>/usr/local/bin</code> kopieren. Nun kann OpenMPT von jedem Verzeichnis aus ausgeführt werden, indem man einfach den Namen des Shell-Skripts eingibt.<br />
<br />
'''Die Zeile in rot muss vorher eventuell angepasst werden!'''<br />
<span style="color:#778">#!/bin/sh</span><br />
<span style="color:#778"># Hier das Verzeichnis und den Namen der exe-Datei eintragen</span><br />
<span style="color:#800">modplug="$HOME/.wine/drive_c/Programme/OpenMPT/mptrack.exe"</span><br />
<br />
<span style="color:#788"># Prüfe, ob wine installiert ist.</span><br />
wine=`which wine`<br />
test $? -ne 0 && echo "Konnte wine nicht finden!" && exit 1<br />
<br />
<span style="color:#788"># Ist der Pfadname korrekt? Wenn nicht, gib Fehlermeldung aus.</span><br />
test ! -f "$modplug" && echo "Konnte $modplug nicht finden" && exit 1<br />
<br />
echo "Starte OpenMPT ..."<br />
<span style="color:#778"># Wenn du die Fehlerausgabe von Wine unterdrücken möchtest,</span><br />
<span style="color:#778"># dann entferne die Raute vor der vorletzten Zeile und</span><br />
<span style="color:#778"># kommentiere die letzte Zeile aus (Raute davor setzen).</span><br />
<span style="color:#778">#$wine "$modplug" 2>/dev/null &</span><br />
$wine "$modplug" &<br />
<br />
<br />
[[Kategorie:Handbuch]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Panning&diff=614
Panning
2009-01-22T15:57:40Z
<p>Cubaxd: /* Die Panning-Slide-Funktion */ + Panbrello</p>
<hr />
<div>{{Effektinfo|Panning|Die Position eines Kanals im Stereospektrum bestimmen|X<br />S8|X<br />S8|8<br />E8|8<br />E8}}<br />
Durch das '''Panning''' ''(schwenken, verschieben)'' lässt sich die Soundausgabe eines jeden Kanals im Stereospektrum individuell einstellen.<br />
<br />
In IT-, MPTM-, und S3M-Modulen heißt der Befehl {{eff|X}} und in MOD- und XM-Modulen {{eff|8}}.<br />
<br />
Der Befehl {{eff|S8}} bzw. {{eff|E8}} hat nur eine geringe Genauigkeit (4 Bit).<br />
<br />
== Kompatiblität ==<br />
Zunächst ein Hinweis für alle MOD- und S3M-Liebhaber: Das originale MOD-Format kennt keine Panning-Befehle (da die vier Soundkanäle des Paula-Chips (der auf dem Amiga unter anderem für den Ton verantwortlich war) fest definierte Panning-Positionen hatten), S3M kennt nur S8x, und dies war auch zur Zeit von Scream Tracker nur auf der Gravis Ultrasound-Karte möglich, die 16 Panning-Positionen bot. PC-Tracker haben das MOD-Format um Panning-Befehle ergänzt und Impulse Tracker führte den {{eff|X}}''xx''-Befehl im S3M-Format ein. Bedenke dies, wenn du z.B. Musik für den Amiga schreiben (MOD) oder valide S3M-Dateien erstellen willst!<br />
<br />
== Definition ==<br />
Wenn einem Sample oder Instrument eine feste Position im Stereospektrum zugewiesen wurde (entweder unter '''[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Set Pan]]''' bei einem Sample oder in der Einstellung '''[[Handbuch:_Instrumente#General|Pan]]''' bei einem Instrument), kann diese Einstellung durch den Befehl {{eff|X}} bzw. {{eff|8}} umgangen werden. Wird jedoch im selben Kanal das Instrument erneut gespielt ohne den Effekt mit anzugeben, sind die Panning-Werte wieder die des Instrumentes/Samples. Wenn einem Instrument oder Sample kein Pan-Wert zugewiesen wurde, verbleibt das Panning an der Position, die vorher durch {{eff|X}} bzw. {{eff|8}} oder eben die Panning-Einstellung des zuletzt gespielten Instrumentes/Samples definiert wurde, und zwar so lange, bis der Effekt erneut ausgeführt, oder ein Instrument bzw. Sample gespielt wird, dem ein Pan-Wert zugewiesen wurde.<br />
<br />
Ein Beispiel: In einem IT-Modul wurde Instrument 1 im Instrument-Editor der Pan-Wert 64 zugewiesen, was im Stereospektrum genau zwischen Links und der Mitte liegt. Für Instrument 2 wurde jedoch keine Position spezifiziert. Instrument 3 hat einen Wert von 192, was genau zwischen der Mitte und Rechts ist.<br />
<br />
{{seq|C-5|01|...|...}}: Instrument 1 wird gespielt, Dieses ist nun halb links zu hören und der Kanal hat sich darauf eingestellt.<br />
<br />
{{seq|C-5|02|...|...}}: Instrument 2 wurde kein Panning-Wert zugewiesen, daher hört man dieses nun an der selben Position wie Instrument 1.<br />
<br />
{{seq|C-5|03|...|...}}: Nun folgt Instrument 3, welches weiter rechts zu hören ist.<br />
<br />
{{seq|C-5|02|...|...}}: Jetzt ist auch Instrument 2 rechts zu hören.<br />
<br />
{{seq|C-5|02|...|X80}}: Wird Instrument 2 unmittelbar danach noch einmal gespielt, ist es auch jetzt auf der rechten Seite hörbar, es sei denn, man setzt, wie in diesem Beispiel, einen neuen Panning-Wert, was in diesem Fall das Instrument in der Mitte hörbar macht (siehe auch die Tabelle weiter unten).<br />
<br />
In der linken Effektspalte (''Volume Column'') kann das Panning mittels {{vol|p}} eingegeben werden. Dieser Befehl verhält sich ähnlich, hat jedoch ''wahrscheinlich'' (weiss nicht :-D ) nur ein Viertel der Genauigkeit, da es dort nur 65 verschiedene Werte gibt (im Gegensatz zu den 256 in der eigentlichen Effektspalte).<br />
<br />
== Das Stereospektrum ==<br />
<div style="position:relative; float:right; margin-left:12px; width:540px;"><br />
{|width="100%" style="border:1px solid #444; background-color:#fff;" cellspacing="1" cellpadding="4"<br />
|width="40%" style="background-color:#ccc;"|<br />
|width="12%" style="background-color:#d77;text-align:center;"|<<<br />
|width="12%" style="background-color:#db7;text-align:center;"|<<br />
|width="12%" style="background-color:#bd7;text-align:center;"|o<br />
|width="12%" style="background-color:#db7;text-align:center;"|><br />
|width="12%" style="background-color:#d77;text-align:center;"|>><br />
|-<br />
|style="background-color:#eee; font-family:"|Volume Column ({{vol|p}}) (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|X}}/{{eff|8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|00<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|40<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|80<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C0<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|FF ¹<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|S8}}/{{eff|E8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|4<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|8<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|F ¹<br />
|-<br />
|style="background-color:#eee;"|[[Handbuch:_Instrumente#General|Instrument-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|64<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|128<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|192<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|256<br />
|-<br />
|style="background-color:#eee; font-family:"|[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Sample-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|}<br />
¹ ''Im Pattern-Editor lässt sich ein Wert nur bis <code>FF</code> (255) bzw. <code>F</code> (15) eingeben. Eine genaue Mitte scheint es hier also nicht zu geben (sofern man davon ausgeht, dass der niedrigste Wert <code>0</code> ist und auch alle Werte belegt sind (?)).''<br />
</div><br />
<br />
Diese Tabelle soll verdeutlichen, wie man in OpenMPT die Position im Stereospektrum festlegt.<br />
<br clear="all" /><br />
<br />
== Panning-Slide ==<br />
<div style="border:1px solid #b1aba0; position:relative; float:right; padding:4px; width:160px; background-color:#eee; margin-left:12px;"><br />
In diesem Beispiel eines Panning-Slides verläuft die Soundausgabe von ganz links nach ganz rechts.<br />
<hr /><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|...|..|...|X00}}<br /><br />
{{seq|...|..|...|X11}}<br /><br />
{{seq|...|..|...|X22}}<br /><br />
{{seq|...|..|...|X33}}<br /><br />
{{seq1|...|..|...|X44}}<br /><br />
{{seq|...|..|...|X55}}<br /><br />
{{seq|...|..|...|X66}}<br /><br />
{{seq|...|..|...|X77}}<br /><br />
{{seq1|...|..|...|X88}}<br /><br />
{{seq|...|..|...|X99}}<br /><br />
{{seq|...|..|...|XAA}}<br /><br />
{{seq|...|..|...|XBB}}<br /><br />
{{seq1|...|..|...|XCC}}<br /><br />
{{seq|...|..|...|XDD}}<br /><br />
{{seq|...|..|...|XEE}}<br /><br />
{{seq|...|..|...|XFF}}<br /><br />
</div><br />
</div><br />
Es gibt mehrere Möglichkeiten, einen Panning-Slide zu erstellen. Zum einen kann man den Befehl {{eff|X}}/{{eff|8}} benutzen, den Befehl {{vol|p}} in der linken Effektspalte, oder man verwendet die eigens dafür vorgesehene [[#Die Panning-Slide-Funktion|Panning-Slide-Funktion]] {{eff|P}}.<br />
<br />
=== Panning-Slide mit der normalen Panning-Funktion ===<br />
Im Kasten rechts sieht man ein Beispiel eines Panning-Slides. In diesem verläuft die Ausgabe des Kanals von ganz links nach ganz rechts. Beachten sollte man hier, dass die Werte nicht allzu weit auseinander liegen dürfen (es sei denn, es ist Absicht), da das Panning sonst sehr ruckartig verläuft. Dies nimmt man umso besser wahr, je langsamer das Modul abspielt. Das Beispiel rechts sollte also nicht als Vorbild dienen :).<br />
<br />
Erstellen lässt sich solch ein Slide, indem man an der Anfangsposition des Bereichs ein {{eff|X}} einfügt und den gewünschten Startwert dahinter schreibt, also beispielsweise {{eff|X00}}. Dies wiederholt man nun noch einmal an der vorgesehenen Endposition mit dem Endwert, z. B. {{eff|XFF}}. Nun wählt man den gesamten Bereich aus, indem man mit der Maus auf den ersten Wert geht und dann die Maustaste gedrückt hält und die Maus über den gesamten Bereich zieht. Dabei muss man darauf achten, dass die Auswahl nicht über die Start- und Zielposition hinausgeht. Wenn man nun {{key|Strg}}+{{key|K}} drückt, sollte der Bereich dazwischen mit den entsprechenden Werten gefüllt werden. Dies funktioniert allerdings nur an Positionen, die nicht mit einem anderen Befehl belegt sind. Alternativ zu Tastenkombination {{key|Strg}}+{{key|K}} kann man auch, nachdem man den Bereich ausgewählt hat, die rechte Maustaste drücken und im danach erscheinenden Menü <code>"Interpolate Effect"</code> auswählen.<br />
<br />
=== Die Panning-Slide-Funktion ===<br />
<br />
{{eff|P1F}}-{{eff|PEF}}: langsam bis mittelschnell nach links<br /><br />
{{eff|P10}}-{{eff|PF0}}: schnell bis sehr schnell nach links<br /><br />
{{eff|PF1}}-{{eff|PFE}}: langsam bis mittelschnell nach rechts<br /><br />
{{eff|P01}}-{{eff|P0F}}: schnell bis sehr schnell nach rechts<br /><br />
<br />
Nachdem dieser Effektbefehl einmal mit Parameter aufgerufen wurde, braucht danach für die Dauer des Slides nur noch der Befehl {{eff|P00}} zu stehen. Da der Wert <code>00</code> bei diesem (und vielen anderen) Effekten nicht definiert ist, wird der zuletzt gültige Wert ausgeführt. Also ist:<br /><br />
{{Effektinfo|Panning-Slide|Panning-Slide-Funktion|P|P|P|}}<br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
gleichbedeutend mit:<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
<br />
== Panbrello ==<br />
{{effektinfo|Panbrello| |Y|Y|Y| }}<br />
<div style="border:1px solid #b1aba0; position:relative; float:left; padding:4px; max-width:300px; background-color:#eee; margin-right:12px;"><br />
<center>Panbrello</center><br />
<hr /><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|F-5|01|...|Y68}}{{seq1|...|..|...|A0E}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|A-5|01|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq1|G-5|01|...|Y00}}{{seq1|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|C-5|01|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq1|...|..|...|Y00}}{{seq1|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq1|F-5|01|...|Y00}}{{seq1|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|G-5|01|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq1|A-5|01|...|Y00}}{{seq1|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|F-5|01|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq1|...|..|...|Y00}}{{seq1|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|...}}<br /><br />
{{seq|...|..|...|Y00}}{{seq|...|..|...|C00}}<br /><br />
</div><br />
</div><br />
Durch den Panbrello-Befehl lässt sich ein Kanal wie ein Ping-Pong-Ball zwischen links und rechts hin- und herspielen. Beim Befehl {{eff|Y}}''xy'' ist ''x'' die Geschwindigkeit und ''y'' die Panningtiefe. Umso größer der Wert ''x'' ist, desto schneller wird das Panning durchgeführt. Genauso verhält es sich mit der Panningtiefe (''y'') &ndash; nur dass hier festgelegt wird, wie deutlich der Panning-Slide hörbar sein soll. Ist der Wert <code>1</code>, wird der Slide kaum wahrgenommen, bei <code>F</code> hingegen umso deutlicher.<br />
<br />
Im Beispiel links wird die bekannte Melodie vom &bdquo;Big Ben&ldquo; ([http://de.wikipedia.org/wiki/Westminsterschlag Westminsterschlag]) gespielt. Durch {{eff|Y68}} wird die Geschwindigkeit (<code>6</code>) und die Tiefe (<code>8</code>) bestimmt. Wenn dieser Wert auch in den folgenden Zeilen angewandt werden soll, reicht es aus, wenn in diesen Zeilen {{eff|Y00}} steht. Denn das bedeutet in diesem Fall &bdquo;benutze den letzten Wert, der ungleich Null ist&ldquo;.<br />
<br />
In Kanal 2 wird durch {{eff|A0E}} das [[Tempo]] festgelegt, in der letzten Zeile ({{eff|C00}}) wird das Pattern abgebrochen.<br />
<br />
[[Kategorie:Effekt]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Handbuch:_Installation&diff=611
Handbuch: Installation
2009-01-21T15:07:36Z
<p>Cubaxd: /* Shell-Skript */</p>
<hr />
<div>{{Handbuch TOC}}<br />
<br />
{{Hinweis|Aktuelle Versionen:|Im [http://modplug.svn.sourceforge.net/viewvc/modplug/trunk/OpenMPT/mptrack/bin/ SVN-Verzeichnis] bei SourceForge kannst du die jeweils neuesten Testbuilds runterladen. Dies ist die aktuelle Version von OpenMPT. Beachte aber, dass diese Versionen unter Umständen Fehler enthalten! Die derzeitige Version 1.17.02.52 läuft allerdings recht stabil.}}<br />
<br />
<br />
== Windows ==<br />
Benötigt wird natürlich einen Windows-PC (am besten Windows 98 oder neuer). Auch ein schneller Prozessor und eine gute Soundkarte können nicht schaden. Auf [http://sourceforge.net/project/showfiles.php?group_id=100385&package_id=230830 SourceForge] kann das neueste "Development Build" von OpenMPT heruntergeladen werden. Ist das Archiv heruntergeladen, können die darin enthalten Dateien in ein beliebiges, vorher erstelltes Verzeichnis kopiert werden. Direkt nach dem Entpacken ist das Programm quasi schon installiert und kann nun ausgeführt werden.<br />
<br />
{{Hinweis|Portabel:|Da keine Installation im eigentlichen Sinne notwendig ist, bzw. da keine Einträge in der Windows-Registry notwendig sind, kann OpenMPT problemlos auch von externen Datenträgern wie z.B. von USB-Sticks gestartet werden.}}<br />
<br />
Um eine Verknüpfung auf dem Desktop zu erstellen geht man wie folgt vor:<br />
# Datei <code>mptrack.exe</code> mit der rechten Maustaste anklicken<br />
# im darauf erscheindenden Menü <code>"Senden an" → "Desktop (Verknüpfung erstellen)"</code> auswählen<br />
Jetzt kann das Programm jederzeit vom Desktop aus gestartet werden.<br />
<br />
<br />
== Wine ==<br />
{{Hinweis|Hinweis|Wenn im Folgenden von Linux die Rede ist, schließt dies auch ähnliche Systeme ein, für die Wine verfügbar ist und die auf einem Intel-Rechner laufen (*BSD, Solaris, ...)}}<br />
<br />
Eine Linux-Version von OpenMPT ist derzeit offiziell nicht geplant. Das Programm kann aber dank [http://winehq.org/ Wine] dennoch genutzt werden.<br />
<br />
Benötigt wird Wine (ab Version 0.9.41), ein Linux-System (Wobei hier auch die Rechnerarchitektur eine Rolle spielt. Wie der Name von Wine es schon andeutet: '''W'''ine '''I'''s '''N'''ot an '''E'''mulator (Wine ist kein Emulator) - und daher laufen Windows-Programme auch nur auf Intel-kompatiblen Rechnern.) und natürlich OpenMPT. Bei älteren Versionen von Wine stürzt OpenMPT ab, sobald man versucht, einen Ton abzuspielen. Außerdem wird die Datei <code>winhttp.dll</code> benötigt (diese bekommt man aus einem existierenden Windows-System (<code>%WINDIR%\system32\winhttp.dll</code>) oder z. B. bei DllDump.com). Die Datei sollte dann nach <code>~/.wine/drive_c/windows/system32/</code> oder in das OpenMPT-Verzeichnis kopiert werden.<br />
<br />
Nachdem man Wine installiert hat, wechselt man in einer Shell in das Verzeichnis, in dem OpenMPT installiert ist und gibt folgende Zeile ein (ohne das $):<br />
$ wine mptrack.exe<br />
Dies sollte das Programm eigentlich starten, sofern<br />
* du im richtigen Verzeichnis bist.<br />
* keine Fehlermeldungen kommen (an denen man in der Regel auch sehen kann, '''was''' nicht funktioniert).<br />
<br />
<br />
{{Hinweis|Tipps zur Fehlerbehebung:|Treten im Betrieb mit Wine Probleme auf, ist evtl. die generische, d.h., die nicht für einen bestimmten Prozessortyp optimierte Ausgabe von OpenMPT der optimierten Variante vorzuziehen. So habe ich OpenMPT generic 1.17.02.28 (1.17RC2) mit Wine 1.0-rc3 unter openSUSE 11.0 Kernel-Version 2.6.25.16-0.1-pae erfolgreich getestet. Einzig bei hoher CPU-Last durch andere Anwendungen geht der Klang verloren, was sich jedoch durch Mausklick auf die PAUSE/PLAY-Taste beheben lässt. Die AMD-optimierte Variante hingegen ist unter diesen Bedingungen abgestürzt (Die Grafikoberfläche der Anwendung verschwindet, während das Stück weiterhin hörbar ist und OpenMPT manuell beendet werden muss, sprich mittels kill-Kommando).}}<br />
<br />
=== Shell-Skript ===<br />
Dieses Skript kann zum Ausführen von OpenMPT verwendet werden. Einfach den Text unten kopieren und mit einem Texteditor z.B. unter dem Namen <code>modplug</code> speichern. Danach mit <br />
chmod 755 modplug<br />
die Datei global lesbar und ausführbar machen und z.B. als root in das Verzeichnis <code>/usr/local/bin</code> kopieren. Nun kann OpenMPT von jedem Verzeichnis aus ausgeführt werden, indem man einfach den Namen des Shell-Skripts eingibt.<br />
<br />
'''Die Zeile in rot muss vorher eventuell angepasst werden!'''<br />
<span style="color:#778">#!/bin/sh</span><br />
<span style="color:#778"># Hier das Verzeichnis und den Namen der exe-Datei eintragen</span><br />
<span style="color:#800">modplug="$HOME/.wine/drive_c/Programme/OpenMPT/mptrack.exe"</span><br />
<br />
<span style="color:#788"># Prüfe, ob wine installiert ist.</span><br />
wine=`which wine`<br />
test $? -ne 0 && echo "Konnte wine nicht finden!" && exit 1<br />
<br />
<span style="color:#788"># Ist der Pfadname korrekt? Wenn nicht, gib Fehlermeldung aus.</span><br />
test ! -f "$modplug" && echo "Konnte $modplug nicht finden" && exit 1<br />
<br />
echo "Starte OpenMPT ..."<br />
<span style="color:#778"># Wenn du die Fehlerausgabe von Wine unterdrücken möchtest,</span><br />
<span style="color:#778"># dann entferne die Raute vor der vorletzten Zeile und</span><br />
<span style="color:#778"># kommentiere die letzte Zeile aus (Raute davor setzen).</span><br />
<span style="color:#778">#$wine "$modplug" 2>/dev/null &</span><br />
$wine "$modplug &<br />
<br />
<br />
[[Kategorie:Handbuch]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=X-Parameter&diff=595
X-Parameter
2009-01-18T20:52:44Z
<p>Cubaxd: off by one ;)</p>
<hr />
<div>{{Effektinfo|X-Parameter|8-bit-Begrenzung bei einigen Befehlen umgehen|#|#|#|<br />}}<br />
Der '''X-Parameter''', im Pattern als {{eff|#}}''xx'' dargestellt, ist kein eigenständiger Effekt, sondern erweitert andere Effekte. Er wird allerdings nur von OpenMPT interpretiert. Einige Effekte (z.B. Tempo, Offset, etc.) können in ihrem Wirkungsbereich erweitert werden. Dabei funktioniert der X-Parameter so ähnlich wie der [[Offset#High_Offset|High Offset]]-Effekt, allerdings wird er anders benutzt.<br />
<br />
===Unterstützte Befehle===<br />
{| cellpadding="2" cellspacing="0" style="border:1px solid #777; width:240px"<br />
|style="background-color:#ccc;border-bottom:1px solid #777;"|Befehl<br />
|style="background-color:#ccc;border-bottom:1px solid #777;"|IT/S3M<br />
|style="background-color:#ccc;border-bottom:1px solid #777;"|XM<br />
|-<br />
|[[Offset]]<br />
|{{eff|O}}''xx''<br />
| {{eff|9}}''xx''<br />
|-<br />
|Break to row<br />
|{{eff|C}}''xx''<br />
| {{eff|D}}''xx''<br />
|-<br />
|[[Tempo]]<br />
|{{eff|T}}''xx''<br />
|{{eff|F}}''xx''<br />
|}<br />
===Verwendung===<br />
<br />
'''Zuerst''' wird der gewünschte Befehl notiert &ndash; zum Beispiel {{eff|O}}''xx'', um den Offset-Parameter zu setzen &ndash; '''danach''' folgen ein oder mehrere {{eff|#}}''xx''-Befehle. Diese Befehle werden dann nach dem folgenden Schema zusammengerechnet.<br />
<br />
<div style="position:relative; float:left; width:220px; text-align:center;"><br />
<br />
<div style="border:1px solid #b1aba0; padding:4px; width:160px; background-color:#eee; margin:auto; text-align:left;"><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|C-5|01|...|O21}}<br /><br />
{{seq|...|..|...|#02}}<br /><br />
</div><br />
</div><br />
<br />
'''Offset: 21 * 100 + 2'''<br /><br />
''Dezimal: 33 * 256 + 2''<br />
<br />
</div><br />
<br />
<div style="position:relative; float:left; width:220px; text-align:center;"><br />
<br />
<div style="border:1px solid #b1aba0; padding:4px; width:160px; background-color:#eee; margin:auto; text-align:left;"><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|C-5|01|...|O21}}<br /><br />
{{seq|...|..|...|#02}}<br /><br />
{{seq|...|..|...|#01}}<br /><br />
</div><br />
</div><br />
<br />
'''Offset: 21 * 10000 + 2 * FF + 1'''<br /><br />
''Dezimal: 33 * 65536 + 2 * 256 + 1''<br />
<br />
</div><br />
<br />
<div style="position:relative; float:left; width:220px; text-align:center;"><br />
<br />
<div style="border:1px solid #b1aba0; padding:4px; width:160px; background-color:#eee; margin:auto; text-align:left;"><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|C-5|01|...|C01}}<br /><br />
{{seq|...|..|...|#10}}<br /><br />
</div><br />
</div><br />
<br />
'''Umbruch zu Zeile: 1 * 100 + 10'''<br /><br />
''Dezimal: 1 * 256 + 16''<br />
<br />
</div><br />
<br />
<div style="position:relative; float:left; width:220px; text-align:center;"><br />
<br />
<div style="border:1px solid #b1aba0; padding:4px; width:160px; background-color:#eee; margin:auto; text-align:left;"><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|C-5|01|...|T01}}<br /><br />
{{seq|...|..|...|#02}}<br /><br />
</div><br />
</div><br />
<br />
'''Tempo: 1 * 100 + 2'''<br /><br />
''Dezimal: 1 * 256 + 2''<br />
<br />
</div><br />
<br />
<br style="clear:both;"><br />
<br />
Das Schema lautet also:<br />
* Bei einem {{eff|#}}''xx''-Befehl: Erster Befehl * 256 + Zweiter Befehl<br />
* Bei zwei {{eff|#}}''xx''-Befehlen: Erster Befehl * 65536 + Zweiter Befehl * 256 + Dritter Befehl<br />
<br />
<br />
[[Kategorie:Effekt]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Lautst%C3%A4rke&diff=594
Lautstärke
2009-01-18T20:37:07Z
<p>Cubaxd: + Kategorie:Effekt</p>
<hr />
<div>Zum Einstellen der '''Lautstärke''' (''volume'') gibt es mehrere Befehle, die sich unterschiedlich auf das Modul auswirken.<br />
<br />
Außerdem gibt es Befehle, die das Ändern der Laustärke mit anderen Effekten kombinieren. Diese werden aber in den Artikeln über die entsprechenden Effekte behandelt ([[#Lautstärke in Verbindung mit anderen Effekten|Lautstärke in Verbindung mit anderen Effekten]]).<br />
<br />
<br />
== Temporäre Lautstärke ==<br />
{{volumeinfo|Temporäre Lautstärke|Lautstärke des aktuellen Instrumentes ändern (''linke Effektspalte'')|v|v|v}}<br />
{{effektinfo|Temporäre Lautstärke|Lautstärke des aktuellen Instrumentes ändern (''rechte Effektspalte'')| | |C|C}}<br />
Der Befehl {{vol|v}} in der linken Effektspalte (''volume column'') wirkt sich ausschließlich auf das aktuelle Instrument aus. Auf eine vorher im selben Kanal gespielte Note, die langsam ausklingt, hat der Effekt keinen Einfluss mehr, wenn eine neue Note gespielt wird.<br />
<br />
Im XM-Format kann alternativ zu {{vol|v}} auch der Befehl {{eff|C}} verwendet werden. Im MOD-Format ist man auf {{eff|C}} angewiesen, da es dort die linke Effektspalte nicht gibt.<br />
<br />
{{Hinweis|Die linke Effektspalte im MOD-Format|Im MOD-Format lässt sich zwar die Volume Column auch bearbeiten, jedoch werden die Einträge dort beim Speichern in die rechte Effektspalte übertragen &ndash; und das auch nur, wenn dort der Effektplatz nicht schon belegt ist!}}<br />
<br />
<br />
== Kanallautstärke ==<br />
{{effektinfo|Kanallautstärke|Lautstärke eines Kanals einstellen|M|M| | }}<br />
Der Befehl {{eff|M}}, den es so nur bei IT/MPTM/S3M-Modulen gibt, wird benutzt, um die Lautstärke eines Kanals dauerhaft zu ändern. Die Lautstärke, die mit {{vol|v}} gesetzt wird, ist immer relativ zu dieser Lautstärke. Das bedeutet, dass bei einer Kanallautstärke von {{eff|M20}} der Befehl {{vol|v64}} nur der Hälfte der Maximallautstärke ({{vol|v64}} und {{eff|M40}}) entspricht.<br />
<br />
Der gültige Bereich liegt bei diesem Befehl zwischen 0x00 und 0x40 (dez.: 0-64).<br />
<br />
{{Hinweis|Hinweis:|Kanal-Lautstärke existiert in S3M-Modulen offiziell nicht. Diese Eigenschaft wurde im Impulse Tracker eingeführt. Module, die diese Funktion benutzten, werden also im Scream Tracker nicht richtig klingen!}}<br />
<br />
== Globale Lautstärke ==<br />
{{effektinfo|Globale Lautstärke|Lautstärke aller Kanäle einstellen|V|V|G| }}<br />
Die globale Laustärke bezieht sich auf das ganze Modul. Alle anderen Laustärke-Befehle sind relativ zu diesem.<br />
<br />
Der Parameter dieses Befehls lässt sich zwischen 0x00 und 0x80 (dez.: 0-128) einstellen und beeinflusst den selben Wert wie der Regler '''Initial global vol''' im [[Handbuch:_General|General-Tab]].<br />
<br />
Nützlich ist dieser Befehl z.B., wenn man ein Lied langsam ausklingen lassen möchte. Dabei sollte man aber entweder am Anfang des Moduls durch diesen Befehl, oder über den Regler '''[[Handbuch:_General#Moduleigenschaften|Initial global vol]]''' die globale Lautstärke festlegen und sich den Wert merken. Dieser Wert sollte dann als der Anfangswert des Fade-outs verwendet.<br />
<br />
== Volume-Slide (Global) ==<br />
{{effektinfo|Fade|Fade-in/Fade-out (Global)|W|W|H| }}<br />
Hier kann die Lautstärke des gesamten Moduls ein- oder ausgefadet werden. Für eine nähere Beschreibung kann die Tabelle weiter unten herangezogen werden. Der einzige Unterschied ist, dass dieser Befehl hier alle Kanäle beeinflusst. Beim Modulformat XM funktionieren hier außerdem nur die Werte {{eff|H01}}-{{eff|H0F}} und {{eff|H10}}-{{eff|HF0}}.<br />
<br style="clear:right;" /><br />
<br />
== Volume-Slide (Kanal) ==<br />
{{effektinfo|Fade|Fade-in/Fade-out (Kanal)|N|N| | }}<br />
Durch {{eff|N}} (nur IT/MPTM/S3M) wird Kanallautstärke kontinuierlich nach oben oder unten geändert. Dafür wird der Befehl i.d.R. mehrfach untereinander geschrieben. Dieser Befehl beeinflusst den selben Parameter, wie der Befehl {{eff|M}} ([[#Kanallautstärke|Kanallautstärke]]), kann also auch durch diesen zurückgesetzt werden.<br />
<br />
{|cellpadding="4" cellspacing="0" style="border:1px solid #aaa;"<br />
|style="background-color:#ccc;border-bottom:1px solid #aaa;width:100px;"|'''Bereich'''<br />
|style="background-color:#ccc;border-bottom:1px solid #aaa;"|'''Auswirkung'''<br />
|-<br />
|{{eff|NF1}}-{{eff|NFE}}<br />
|Die Lautstärke des Kanals ändert sich langsam nach unten &ndash; bei {{eff|NF1}} am langsamsten.<br />
|-<br />
|{{eff|N1F}}-{{eff|NEF}}<br />
|Die Lautstärke wird langsam nach oben geändert, bei {{eff|N1F}} am langsamsten. Das hintere Zeichen muss hier immer <code>F</code> sein, das heißt, der eigentliche Gültigkeitsbereich liegt hier zwischen <code>1</code> und <code>E</code>. Es gibt also 14 verschiedene Stufen.<br />
|-<br />
|{{eff|N01}}-{{eff|N0F}}<br />
|Die Kanallautstärke wird schnell nach unten geändert &ndash; je höher der Wert, desto schneller der Fade. Hier gibt es 15 Geschwindigkeitsstufen.<br />
|-<br />
|{{eff|N10}}-{{eff|NF0}}<br />
|Hier muss der hintere Wert <code>0</code> sein. Die Lautstärke des Kanals lässt sich hiermit kontinuierlich erhöhen. Umso kleiner der Wert, desto langsamer der Fade.<br />
|}<br />
<br />
<br />
== Volume-Slide (Note)==<br />
<div style="float:right;margin-left:8px;"><br />
{{effektinfo|Fade-in|schneller Fade-in/Fade-out|D|D|A|A}}<br />
{{effektinfo|Fade-in|langsamer Fade-in/Fade-out|D|D|E|E}}<br />
</div><br />
<div style="float:left;margin-right:8px;"><br />
{{volumeinfo|Fade-in|langsamer Fade-in (oben)<br />schneller Fade-in (unten)|a<br />c| |a<br />c}}<br />
{{volumeinfo|Fade-out|langsamer Fade-out (oben)<br />schneller Fade-out (unten)|b<br />d| |b<br />d}}<br />
</div><br />
<br />
Diese Befehle kann man sich &ndash; wie auch die Befehl {{eff|N}} und {{eff|W}}/{{eff|H}} &ndash; wie die Schieberegler eines Mischpults vorstellen.<br />
Je höher der Wert ist, desto schneller wird die Lautstärke nach oben bzw. unten geändert. Bei den Befehlen in der ''Volume column'' liegt der Bereich beim IT-Format zwischen 0 und 9, beim XM-Format zwischen 0 und 15.<br />
<br />
In der ''Effect column'' gibt es den Befehl {{eff|D}} (IT/MPTM/S3M) bzw. {{eff|A}}/{{eff|E}} (XM/MOD). Wie der Befehl {{eff|D}} funktioniert, kann man in der Tabelle weiter oben lesen.<br />
<br />
Jedoch sind diese Befehle nur temporär. Wird eine neue Note/ein neues Instrument im selben Kanal gespielt, wird dadurch auch die Lautstärke auf die Standardlautstärke zurückgesetzt. Handelt es sich bei mehreren aufeinander folgend gespielten Noten um das selbe Sample, kann man diese Beschränkung umgehen, indem man bei allen Noten, außer der ersten, die Instrument-Nummer entfernt. In der Regel gibt es für diese Aufgabe aber geeignetere Befehle (beispielsweise [[#Volume-Slide (Kanal)|Volume-Slide (Kanal)]]).<br />
<br />
<br />
== Lautstärke in Verbindung mit anderen Effekten ==<br />
Diese Effekte bewirken bei der Lautstärke in der Regel einen Fade-In bzw. Fade-Out.<br />
* [[Portamento#Tone Portamento und Lautstärke|Tone Portamento und Lautstärke]]<br />
<br />
<br />
[[Kategorie:Effekt]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Handbuch:_Kommandozeilen-Parameter&diff=593
Handbuch: Kommandozeilen-Parameter
2009-01-18T20:08:13Z
<p>Cubaxd: + Kategorie:Handbuch</p>
<hr />
<div>{{Handbuch TOC}}<br />
<br />
Die folgenden Kommandozeilen-Parameter können beim Start an OpenMPT übergeben werden:<br />
<br />
{|cellspacing="0"<br />
|style="background-color:#cef;border-top:1px solid black"|'''Parameter'''<br />
|style="background-color:#cef;border-top:1px solid black"|'''Beschreibung'''<br />
|-<br />
| -nologo<br />
|Während dem Start wird nicht das OpenMPT-Logo angezeigt.<br />
|-<br />
|style="background-color:#eee"| -nodls<br />
|style="background-color:#eee"|Es wird nicht nach DLS-Soundfonts gesucht<br />
|-<br />
| -noacm<br />
| Es wird nicht nach einem ACM-Codec gesucht.<br />
|-<br />
|style="background-color:#eee"| -nomp3<br />
|style="background-color:#eee"| Es wird nicht nach einem MP3-Codec gesucht.<br />
|-<br />
| -wavex<br />
|Multichannel-Support wird aktiviert.<br />
|-<br />
|style="background-color:#eee"| -noplugs<br />
|style="background-color:#eee"|Es wird nicht nach VST-Plugins und DirectX-Soundeffekten gesucht. Zuvor benutzte Plugins werden nicht geladen.<br />
|-<br />
|style="border-bottom:1px solid black"| -debug<br />
|style="border-bottom:1px solid black"|OpenMPT wird im Debug-Modus gestartet.<br />
|}<br />
<br />
[[Kategorie:Handbuch]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Vorlage:Effektinfo&diff=592
Vorlage:Effektinfo
2009-01-18T20:01:22Z
<p>Cubaxd: </p>
<hr />
<div><noinclude><br />
<br />
Infobox für Effektbefehle:<br />
<br />
Benutzung:<br />
<br />
<pre>{{Effektinfo|<Effekt>|<Beschreibung>|<IT>|<S3M>|<XM>|<MOD>}}</pre><br />
<br />
</noinclude><div style="<br />
border:1px solid #888;<br />
background-color:#e2eaef;<br />
position:relative;<br />
float:right;<br />
padding:4px;<br />
clear:both;<br />
margin-left:12px;<br />
margin-bottom:1px;<br />
width:280px;"><br />
{|style="background-color:aac;text-align:center;width:100%;" cellspacing="0"<br />
|colspan="4" style="text-align:center; background-color:#cef;"|'''{{{1}}}'''<br />
|-<br />
|style="padding-top:8px; padding-bottom:8px;background-color:#f2faff;"|{{{2}}}<br />
|-<br />
{|cellpadding="2" cellspacing="0" style="background-color:#e8e8ec; border:1px solid #888; width:100%; text-align:center;"<br />
|-<br />
|class="effbox" style="vertical-align:top" width="25%"|IT<br /><span class="effcol">{{{3}}}</span><br />
|class="effbox" style="vertical-align:top" width="25%"|S3M<br /><span class="effcol">{{{4}}}</span><br />
|class="effbox" style="vertical-align:top" width="25%"|XM<br /><span class="effcol">{{{5}}}</span><br />
|class="effbox" style="vertical-align:top" width="25%"|MOD<br /><span class="effcol">{{{6}}}</span><br />
|}<br />
|}<br />
</div><br />
<noinclude><br />
[[Kategorie:Vorlage]]<br />
</noinclude></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Panning&diff=591
Panning
2009-01-18T16:49:42Z
<p>Cubaxd: /* Kompatiblität */</p>
<hr />
<div>{{Effektinfo|Panning|Die Position eines Kanals im Stereospektrum bestimmen|X<br />S8|X<br />S8|8<br />E8|8<br />E8}}<br />
Durch das '''Panning''' ''(schwenken, verschieben)'' lässt sich die Soundausgabe eines jeden Kanals im Stereospektrum individuell einstellen.<br />
<br />
In IT-, MPTM-, und S3M-Modulen heißt der Befehl {{eff|X}} und in MOD- und XM-Modulen {{eff|8}}.<br />
<br />
Der Befehl {{eff|S8}} bzw. {{eff|E8}} hat nur eine geringe Genauigkeit (4 Bit).<br />
<br />
== Kompatiblität ==<br />
Zunächst ein Hinweis für alle MOD- und S3M-Liebhaber: Das originale MOD-Format kennt keine Panning-Befehle (da die vier Soundkanäle des Paula-Chips (der auf dem Amiga unter anderem für den Ton verantwortlich war) fest definierte Panning-Positionen hatten), S3M kennt nur S8x, und dies war auch zur Zeit von Scream Tracker nur auf der Gravis Ultrasound-Karte möglich, die 16 Panning-Positionen bot. PC-Tracker haben das MOD-Format um Panning-Befehle ergänzt und Impulse Tracker führte den {{eff|X}}''xx''-Befehl im S3M-Format ein. Bedenke dies, wenn du z.B. Musik für den Amiga schreiben (MOD) oder valide S3M-Dateien erstellen willst!<br />
<br />
== Definition ==<br />
Wenn einem Sample oder Instrument eine feste Position im Stereospektrum zugewiesen wurde (entweder unter '''[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Set Pan]]''' bei einem Sample oder in der Einstellung '''[[Handbuch:_Instrumente#General|Pan]]''' bei einem Instrument), kann diese Einstellung durch den Befehl {{eff|X}} bzw. {{eff|8}} umgangen werden. Wird jedoch im selben Kanal das Instrument erneut gespielt ohne den Effekt mit anzugeben, sind die Panning-Werte wieder die des Instrumentes/Samples. Wenn einem Instrument oder Sample kein Pan-Wert zugewiesen wurde, verbleibt das Panning an der Position, die vorher durch {{eff|X}} bzw. {{eff|8}} oder eben die Panning-Einstellung des zuletzt gespielten Instrumentes/Samples definiert wurde, und zwar so lange, bis der Effekt erneut ausgeführt, oder ein Instrument bzw. Sample gespielt wird, dem ein Pan-Wert zugewiesen wurde.<br />
<br />
Ein Beispiel: In einem IT-Modul wurde Instrument 1 im Instrument-Editor der Pan-Wert 64 zugewiesen, was im Stereospektrum genau zwischen Links und der Mitte liegt. Für Instrument 2 wurde jedoch keine Position spezifiziert. Instrument 3 hat einen Wert von 192, was genau zwischen der Mitte und Rechts ist.<br />
<br />
{{seq|C-5|01|...|...}}: Instrument 1 wird gespielt, Dieses ist nun halb links zu hören und der Kanal hat sich darauf eingestellt.<br />
<br />
{{seq|C-5|02|...|...}}: Instrument 2 wurde kein Panning-Wert zugewiesen, daher hört man dieses nun an der selben Position wie Instrument 1.<br />
<br />
{{seq|C-5|03|...|...}}: Nun folgt Instrument 3, welches weiter rechts zu hören ist.<br />
<br />
{{seq|C-5|02|...|...}}: Jetzt ist auch Instrument 2 rechts zu hören.<br />
<br />
{{seq|C-5|02|...|X80}}: Wird Instrument 2 unmittelbar danach noch einmal gespielt, ist es auch jetzt auf der rechten Seite hörbar, es sei denn, man setzt, wie in diesem Beispiel, einen neuen Panning-Wert, was in diesem Fall das Instrument in der Mitte hörbar macht (siehe auch die Tabelle weiter unten).<br />
<br />
In der linken Effektspalte (''Volume Column'') kann das Panning mittels {{vol|p}} eingegeben werden. Dieser Befehl verhält sich ähnlich, hat jedoch ''wahrscheinlich'' (weiss nicht :-D ) nur ein Viertel der Genauigkeit, da es dort nur 65 verschiedene Werte gibt (im Gegensatz zu den 256 in der eigentlichen Effektspalte).<br />
<br />
== Das Stereospektrum ==<br />
<div style="position:relative; float:right; margin-left:12px; width:540px;"><br />
{|width="100%" style="border:1px solid #444; background-color:#fff;" cellspacing="1" cellpadding="4"<br />
|width="40%" style="background-color:#ccc;"|<br />
|width="12%" style="background-color:#d77;text-align:center;"|<<<br />
|width="12%" style="background-color:#db7;text-align:center;"|<<br />
|width="12%" style="background-color:#bd7;text-align:center;"|o<br />
|width="12%" style="background-color:#db7;text-align:center;"|><br />
|width="12%" style="background-color:#d77;text-align:center;"|>><br />
|-<br />
|style="background-color:#eee; font-family:"|Volume Column ({{vol|p}}) (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|X}}/{{eff|8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|00<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|40<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|80<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C0<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|FF ¹<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|S8}}/{{eff|E8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|4<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|8<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|F ¹<br />
|-<br />
|style="background-color:#eee;"|[[Handbuch:_Instrumente#General|Instrument-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|64<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|128<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|192<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|256<br />
|-<br />
|style="background-color:#eee; font-family:"|[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Sample-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|}<br />
¹ ''Im Pattern-Editor lässt sich ein Wert nur bis <code>FF</code> (255) bzw. <code>F</code> (15) eingeben. Eine genaue Mitte scheint es hier also nicht zu geben (sofern man davon ausgeht, dass der niedrigste Wert <code>0</code> ist und auch alle Werte belegt sind (?)).''<br />
</div><br />
<br />
Diese Tabelle soll verdeutlichen, wie man in OpenMPT die Position im Stereospektrum festlegt.<br />
<br clear="all" /><br />
<br />
== Panning-Slide ==<br />
<div style="border:1px solid #b1aba0; position:relative; float:right; padding:4px; width:160px; background-color:#eee; margin-left:12px;"><br />
In diesem Beispiel eines Panning-Slides verläuft die Soundausgabe von ganz links nach ganz rechts.<br />
<hr /><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|...|..|...|X00}}<br /><br />
{{seq|...|..|...|X11}}<br /><br />
{{seq|...|..|...|X22}}<br /><br />
{{seq|...|..|...|X33}}<br /><br />
{{seq1|...|..|...|X44}}<br /><br />
{{seq|...|..|...|X55}}<br /><br />
{{seq|...|..|...|X66}}<br /><br />
{{seq|...|..|...|X77}}<br /><br />
{{seq1|...|..|...|X88}}<br /><br />
{{seq|...|..|...|X99}}<br /><br />
{{seq|...|..|...|XAA}}<br /><br />
{{seq|...|..|...|XBB}}<br /><br />
{{seq1|...|..|...|XCC}}<br /><br />
{{seq|...|..|...|XDD}}<br /><br />
{{seq|...|..|...|XEE}}<br /><br />
{{seq|...|..|...|XFF}}<br /><br />
</div><br />
</div><br />
Es gibt mehrere Möglichkeiten, einen Panning-Slide zu erstellen. Zum einen kann man den Befehl {{eff|X}}/{{eff|8}} benutzen, den Befehl {{vol|p}} in der linken Effektspalte, oder man verwendet die eigens dafür vorgesehene [[#Die Panning-Slide-Funktion|Panning-Slide-Funktion]] {{eff|P}}.<br />
<br />
=== Panning-Slide mit der normalen Panning-Funktion ===<br />
Im Kasten rechts sieht man ein Beispiel eines Panning-Slides. In diesem verläuft die Ausgabe des Kanals von ganz links nach ganz rechts. Beachten sollte man hier, dass die Werte nicht allzu weit auseinander liegen dürfen (es sei denn, es ist Absicht), da das Panning sonst sehr ruckartig verläuft. Dies nimmt man umso besser wahr, je langsamer das Modul abspielt. Das Beispiel rechts sollte also nicht als Vorbild dienen :).<br />
<br />
Erstellen lässt sich solch ein Slide, indem man an der Anfangsposition des Bereichs ein {{eff|X}} einfügt und den gewünschten Startwert dahinter schreibt, also beispielsweise {{eff|X00}}. Dies wiederholt man nun noch einmal an der vorgesehenen Endposition mit dem Endwert, z. B. {{eff|XFF}}. Nun wählt man den gesamten Bereich aus, indem man mit der Maus auf den ersten Wert geht und dann die Maustaste gedrückt hält und die Maus über den gesamten Bereich zieht. Dabei muss man darauf achten, dass die Auswahl nicht über die Start- und Zielposition hinausgeht. Wenn man nun {{key|Strg}}+{{key|K}} drückt, sollte der Bereich dazwischen mit den entsprechenden Werten gefüllt werden. Dies funktioniert allerdings nur an Positionen, die nicht mit einem anderen Befehl belegt sind. Alternativ zu Tastenkombination {{key|Strg}}+{{key|K}} kann man auch, nachdem man den Bereich ausgewählt hat, die rechte Maustaste drücken und im danach erscheinenden Menü <code>"Interpolate Effect"</code> auswählen.<br />
<br />
=== Die Panning-Slide-Funktion ===<br />
<br />
{{eff|P1F}}-{{eff|PEF}}: langsam bis mittelschnell nach links<br /><br />
{{eff|P10}}-{{eff|PF0}}: schnell bis sehr schnell nach links<br /><br />
{{eff|PF1}}-{{eff|PFE}}: langsam bis mittelschnell nach rechts<br /><br />
{{eff|P01}}-{{eff|P0F}}: schnell bis sehr schnell nach rechts<br /><br />
<br />
Nachdem dieser Effektbefehl einmal mit Parameter aufgerufen wurde, braucht danach für die Dauer des Slides nur noch der Befehl {{eff|P00}} zu stehen. Da der Wert <code>00</code> bei diesem (und vielen anderen) Effekten nicht definiert ist, wird der zuletzt gültige Wert ausgeführt. Also ist:<br /><br />
{{Effektinfo|Panning-Slide|Panning-Slide-Funktion|P|P|P|}}<br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
gleichbedeutend mit:<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
<br />
[[Kategorie:Effekt]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_Effektparameter_bearbeiten&diff=589
Tutorial: Effektparameter bearbeiten
2009-01-18T16:39:24Z
<p>Cubaxd: /* Der Parameter-Editor */</p>
<hr />
<div>In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen.<br />
Für Benutzer, die in Mathe etwas versierter sind, bzw. schon lange mit Trackern arbeiten und die sich mit dem Hexadezimalsystem auskennen, ist der Patterneditor allein zum Eintragen der Parameter in den meisten Fällen ausreichend. Jedoch verfügt OpenMPT auch über Benutzungshilfen, die insbesondere Anfängern das Arbeiten mit dem Programm erleichtern. Auf diese wird in diesem Tutorial näher eingegangen.<br />
<br />
{{Hinweis|Wichtig|Die Beispiele in diesem Tutorial lassen sich in dem Formaten IT, MPTM und S3M nachvollziehen.}}<br />
<br />
== Der &bdquo;Note Properties&ldquo;-Dialog==<br />
[[Bild:Menutaste.png|right]]<br />
Der '''Note Properties'''-Dialog lässt sich durch einen Klick auf die Menütaste (siehe Abbildung rechts) öffnen. Diese ist unten neben der rechten {{key|Strg}}-Taste zu finden, ist aber nicht auf jeder Tastatur vorhanden. Alternativ kann das Fenster auch durch einen Doppelklick in der Zeile und Spalte des Pattern-Editors, die bearbeitet werden soll, geöffnet werden. Je nachdem, ob man den Dialog von der Note/Instrument-Spalte, der Volume-, oder der Effekt-Spalte öffnet, ist im Fenster der entsprechende Reiter schon geöffnet. Von diesen Reitern gibt es genau 3:<br />
<br />
===Note===<br />
[[Bild:note_properties_note.png|right]]<br />
Hier kann die Note und das Instrument ausgesucht werden.<br />
Wenn wir hier, wie in der Abbildung zu sehen, links die Note {{note|D-5}} und rechts Instrument {{smp|01}} auswählen, dann sehen wir im Pattern-Editor:<br />
<br />
{{seq|D-5|01|...|...}}<br />
<br />
Die Note lässt sich über den Pattern-Editor allerdings viel einfacher und schneller eintragen.<br />
<br />
<br />
===Volume===<br />
[[Bild:note_properties_volume.png|right]]<br />
Links unter '''Volume Command''' kann ein Befehl ausgesucht werden, der in diesem Kanal und in dieser Spalte eingetragen werden soll. Mit dem Schieberegler rechts kann der Wert für den Befehl eingestellt werden. Sucht man z.B. links den Befehl '''v: Set Volume''' aus, kann man rechts mit dem Schieberegler den Parameter zwischen <code>0</code> und <code>64</code> einstellen. Das Instrument, das nun an dieser Stelle gespielt wird, hat jetzt genau die Lautstärke, die vorher mit dem Schieberegler definiert wurde.<br />
<br />
Wenn wir unser Beispiel von vorhin nehmen, hat sich dies nun erweitert zu:<br />
<br />
{{seq|D-5|01|v32|...}}<br />
<br />
Unsere Gitarre spielt nun also einen Ton in Zimmerlautstärke. Das schont neben den Boxen auch die Nachbarn.<br />
<br />
Auch hier dürfte es nach einiger Zeit viel leichter und zeitsparender sein, die Befehle und deren Parameter direkt im Pattern-Editor einzutragen.<br />
<br />
===Effect===<br />
[[Bild:note_properties_effect.png|right]]<br />
Die Effektspalte ist aber sicher die komplexeste von allen. Hier gibt es Myriaden verschiedene Befehle (nagut &ndash; nicht ganz, aber ein paar Dutzend sind es schon), deren Parameter auch noch hexadezimal eingetragen werden müssen und wo aus den Zahlen allein in vielen Fällen gar nicht ersichtlich ist, was dieser Befehl nun mit einem bestimmten Parameter bewirkt. Der '''Note Properties'''-Dialog bietet hier auch Hilfe an (aber auf englisch). Als Beispiel sei hier mal der Befehl {{eff|S9}} erwähnt. Wählt man diesen aus und bewegt nun den Schieberegler, sieht man, dass dieser unscheinbare Befehl [[Soundsteuerung|einiges zu bieten hat]]. So kann man, wenn der Regler auf <code>9F</code> gestellt ist, das Sample an dieser Stelle rückwärts abspielen.<br />
<br />
Wir erweitern noch einmal das Beispiel von vorhin:<br />
<br />
{{seq|D-5|01|v32|S9F}}<br />
<br />
Nun wird unsere Gitarre bei halber Lautstärke rückwärts gespielt. Das hat OpenMPT einer echten Klampfe schonmal vorraus ;)<br />
<br />
Nach einer Weile, wenn man sich die entsprechenden Nummern der verschiedenen Effekte eingeprägt hat, kann man ja mehr und mehr dazu übergehen, die Befehle über den Pattern-Editor von Hand einzutragen.<br />
<br />
== Der Parameter-Editor ==<br />
[[Bild:Pattern_editor_linear.png|left]]<br />
[[Bild:Pattern_editor_curve.png|right]]<br />
Möchtest du in einem Kanal einen Slide (z.B. für [[Lautstärke]] oder [[Panning]]) erstellen, kannst du so vorgehen, wie in [[Panning#Panning-Slide mit der normalen Panning-Funktion|diesem Beispiel]] beschrieben. Wenn man das Beispiel befolgt hat, hat man etwo so einen Slide, wie den in der Abbildung links. Mit dem Parameter-Editor kann man die Sache noch ein wenig ''abrunden''. Dafür wählt man den gesamten Bereich aus, wie in der Abbildung rechts zu sehen und gibt danach {{key|Alt}}+{{key|B}} ein oder klickt in dem Kanal die rechte Maustaste und im darauf erscheinenden Menü auf "Visualize Effect".<br />
<br />
Der Slide in der Abbildung auf der linken Seite zieht sich über 48 Zeilen. In Zeile 0 steht der Befehl {{eff|X00}}, in der 24. {{eff|XFF}} und in der Letzten wieder {{eff|X00}}. Das bedeutet, der Kanal ist erst links zu hören, geht dann über nach rechts (Zeile 24) und wieder zurück nach links. Im Parameter-Editor sieht das wie folgt aus:<br />
[[Bild:Param_editor_linear.png|center]]<br />
Nun kann man im Parameter-Editor die Slider ganz einfach so verschieben, so dass sie eine Kurve ergeben. Dadurch klingt auch der Panning-Slide viel ''natürlicher''. Ohne diese Änderung nimmt man in vielen Fällen besonders ganz links und rechts außen eine abrupte Zu- und Abnahme der Lautstärke wahr. Wie man am Beispiel rechts sehen kann, wurden unsere Änderungen direkt in den Pattern-Editor übernommen &ndash; und nein &ndash; es ist keine perfekte Kurve :).<br />
[[Bild:Param_editor_curve.png|center]]<br />
<br />
<br />
<br />
[[Kategorie:Tutorial]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_Effektparameter_bearbeiten&diff=588
Tutorial: Effektparameter bearbeiten
2009-01-18T16:27:54Z
<p>Cubaxd: Das Beispiel mit dem Cembalo war blöd. Solche Samples ham ja meist nen Loop, da is dann nix mit rückwärts spielen.</p>
<hr />
<div>In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen.<br />
Für Benutzer, die in Mathe etwas versierter sind, bzw. schon lange mit Trackern arbeiten und die sich mit dem Hexadezimalsystem auskennen, ist der Patterneditor allein zum Eintragen der Parameter in den meisten Fällen ausreichend. Jedoch verfügt OpenMPT auch über Benutzungshilfen, die insbesondere Anfängern das Arbeiten mit dem Programm erleichtern. Auf diese wird in diesem Tutorial näher eingegangen.<br />
<br />
{{Hinweis|Wichtig|Die Beispiele in diesem Tutorial lassen sich in dem Formaten IT, MPTM und S3M nachvollziehen.}}<br />
<br />
== Der &bdquo;Note Properties&ldquo;-Dialog==<br />
[[Bild:Menutaste.png|right]]<br />
Der '''Note Properties'''-Dialog lässt sich durch einen Klick auf die Menütaste (siehe Abbildung rechts) öffnen. Diese ist unten neben der rechten {{key|Strg}}-Taste zu finden, ist aber nicht auf jeder Tastatur vorhanden. Alternativ kann das Fenster auch durch einen Doppelklick in der Zeile und Spalte des Pattern-Editors, die bearbeitet werden soll, geöffnet werden. Je nachdem, ob man den Dialog von der Note/Instrument-Spalte, der Volume-, oder der Effekt-Spalte öffnet, ist im Fenster der entsprechende Reiter schon geöffnet. Von diesen Reitern gibt es genau 3:<br />
<br />
===Note===<br />
[[Bild:note_properties_note.png|right]]<br />
Hier kann die Note und das Instrument ausgesucht werden.<br />
Wenn wir hier, wie in der Abbildung zu sehen, links die Note {{note|D-5}} und rechts Instrument {{smp|01}} auswählen, dann sehen wir im Pattern-Editor:<br />
<br />
{{seq|D-5|01|...|...}}<br />
<br />
Die Note lässt sich über den Pattern-Editor allerdings viel einfacher und schneller eintragen.<br />
<br />
<br />
===Volume===<br />
[[Bild:note_properties_volume.png|right]]<br />
Links unter '''Volume Command''' kann ein Befehl ausgesucht werden, der in diesem Kanal und in dieser Spalte eingetragen werden soll. Mit dem Schieberegler rechts kann der Wert für den Befehl eingestellt werden. Sucht man z.B. links den Befehl '''v: Set Volume''' aus, kann man rechts mit dem Schieberegler den Parameter zwischen <code>0</code> und <code>64</code> einstellen. Das Instrument, das nun an dieser Stelle gespielt wird, hat jetzt genau die Lautstärke, die vorher mit dem Schieberegler definiert wurde.<br />
<br />
Wenn wir unser Beispiel von vorhin nehmen, hat sich dies nun erweitert zu:<br />
<br />
{{seq|D-5|01|v32|...}}<br />
<br />
Unsere Gitarre spielt nun also einen Ton in Zimmerlautstärke. Das schont neben den Boxen auch die Nachbarn.<br />
<br />
Auch hier dürfte es nach einiger Zeit viel leichter und zeitsparender sein, die Befehle und deren Parameter direkt im Pattern-Editor einzutragen.<br />
<br />
===Effect===<br />
[[Bild:note_properties_effect.png|right]]<br />
Die Effektspalte ist aber sicher die komplexeste von allen. Hier gibt es Myriaden verschiedene Befehle (nagut &ndash; nicht ganz, aber ein paar Dutzend sind es schon), deren Parameter auch noch hexadezimal eingetragen werden müssen und wo aus den Zahlen allein in vielen Fällen gar nicht ersichtlich ist, was dieser Befehl nun mit einem bestimmten Parameter bewirkt. Der '''Note Properties'''-Dialog bietet hier auch Hilfe an (aber auf englisch). Als Beispiel sei hier mal der Befehl {{eff|S9}} erwähnt. Wählt man diesen aus und bewegt nun den Schieberegler, sieht man, dass dieser unscheinbare Befehl [[Soundsteuerung|einiges zu bieten hat]]. So kann man, wenn der Regler auf <code>9F</code> gestellt ist, das Sample an dieser Stelle rückwärts abspielen.<br />
<br />
Wir erweitern noch einmal das Beispiel von vorhin:<br />
<br />
{{seq|D-5|01|v32|S9F}}<br />
<br />
Nun wird unsere Gitarre bei halber Lautstärke rückwärts gespielt. Das hat OpenMPT einer echten Klampfe schonmal vorraus ;)<br />
<br />
Nach einer Weile, wenn man sich die entsprechenden Nummern der verschiedenen Effekte eingeprägt hat, kann man ja mehr und mehr dazu übergehen, die Befehle über den Pattern-Editor von Hand einzutragen.<br />
<br />
== Der Parameter-Editor ==<br />
[[Bild:Pattern_editor_linear.png|left]]<br />
[[Bild:Pattern_editor_curve.png|right]]<br />
Möchtest du in einem Kanal einen Slide (z.B. für [[Lautstärke]] oder [[Panning]]) erstellen, kannst du so vorgehen, wie in [[Panning#Panning-Slide mit der normalen Panning-Funktion|diesem Beispiel]] beschrieben. Wenn man das Beispiel befolgt hat, hat man etwo so einen Slide, wie den in der Abbildung links. Mit dem Parameter-Editor kann man die Sache noch ein wenig ''abrunden''. Dafür wählt man den gesamten Bereich aus, wie in der Abbildung rechts zu sehen und gibt danach {{key|Alt}}+{{key|B}} ein oder klickt in dem Kanal die rechte Maustaste und im darauf erscheinenden Menü auf "Visualize Effect".<br />
<br />
Der Slide in der Abbildung auf der linken Seite zieht sich über 64 Zeilen. In der ersten Zeile steht der Befehl {{eff|X00}}, in der 32. {{eff|XFF}} und in der Letzten wieder {{eff|X00}}. Das bedeutet, der Kanal ist erst links zu hören, geht dann über nach rechts (Zeile 32) und wieder zurück nach links. Im Parameter-Editor sieht das wie folgt aus:<br />
[[Bild:Param_editor_linear.png|center]]<br />
Nun kann man im Parameter-Editor die Slider ganz einfach so verschieben, so dass sie eine Kurve ergeben. Dadurch klingt auch der Panning-Slide viel ''natürlicher''. Ohne diese Änderung nimmt man in vielen Fällen besonders ganz links und rechts außen eine abrupte Zu- und Abnahme der Lautstärke wahr. Wie man am Beispiel rechts sehen kann, wurden unsere Änderungen direkt in den Pattern-Editor übernommen &ndash; und nein &ndash; es ist keine perfekte Kurve :).<br />
[[Bild:Param_editor_curve.png|center]]<br />
<br />
<br />
<br />
[[Kategorie:Tutorial]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Note_properties_note.png&diff=587
Datei:Note properties note.png
2009-01-18T16:24:27Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_Effektparameter_bearbeiten&diff=584
Tutorial: Effektparameter bearbeiten
2009-01-18T16:12:13Z
<p>Cubaxd: </p>
<hr />
<div>In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen.<br />
Für Benutzer, die in Mathe etwas versierter sind, bzw. schon lange mit Trackern arbeiten und die sich mit dem Hexadezimalsystem auskennen, ist der Patterneditor allein zum Eintragen der Parameter in den meisten Fällen ausreichend. Jedoch verfügt OpenMPT auch über Benutzungshilfen, die insbesondere Anfängern das Arbeiten mit dem Programm erleichtern. Auf diese wird in diesem Tutorial näher eingegangen.<br />
<br />
{{Hinweis|Wichtig|Die Beispiele in diesem Tutorial lassen sich in dem Formaten IT, MPTM und S3M nachvollziehen.}}<br />
<br />
== Der &bdquo;Note Properties&ldquo;-Dialog==<br />
[[Bild:Menutaste.png|right]]<br />
Der '''Note Properties'''-Dialog lässt sich durch einen Klick auf die Menütaste (siehe Abbildung rechts) öffnen. Diese ist unten neben der rechten {{key|Strg}}-Taste zu finden, ist aber nicht auf jeder Tastatur vorhanden. Alternativ kann das Fenster auch durch einen Doppelklick in der Zeile und Spalte des Pattern-Editors, die bearbeitet werden soll, geöffnet werden. Je nachdem, ob man den Dialog von der Note/Instrument-Spalte, der Volume-, oder der Effekt-Spalte öffnet, ist im Fenster der entsprechende Reiter schon geöffnet. Von diesen Reitern gibt es genau 3:<br />
<br />
===Note===<br />
[[Bild:note_properties_note.png|right]]<br />
Hier kann die Note und das Instrument ausgesucht werden.<br />
Wenn wir hier, wie in der Abbildung zu sehen, links die Note {{note|D-5}} und rechts Instrument {{smp|01}} auswählen, dann sehen wir im Pattern-Editor:<br />
<br />
{{seq|D-5|01|...|...}}<br />
<br />
Die Note lässt sich über den Pattern-Editor allerdings viel einfacher und schneller eintragen.<br />
<br />
<br />
===Volume===<br />
[[Bild:note_properties_volume.png|right]]<br />
Links unter '''Volume Command''' kann ein Befehl ausgesucht werden, der in diesem Kanal und in dieser Spalte eingetragen werden soll. Mit dem Schieberegler rechts kann der Wert für den Befehl eingestellt werden. Sucht man z.B. links den Befehl '''v: Set Volume''' aus, kann man rechts mit dem Schieberegler den Parameter zwischen <code>0</code> und <code>64</code> einstellen. Das Instrument, das nun an dieser Stelle gespielt wird, hat jetzt genau die Lautstärke, die vorher mit dem Schieberegler definiert wurde.<br />
<br />
Wenn wir unser Beispiel von vorhin nehmen, hat sich dies nun erweitert zu:<br />
<br />
{{seq|D-5|01|v32|...}}<br />
<br />
Unser Cembalo spielt spielt nun also einen Ton in Zimmerlautstärke. Das schont neben den Boxen auch die Nachbarn.<br />
<br />
Auch hier dürfte es nach einiger Zeit viel leichter und zeitsparender sein, die Befehle und deren Parameter direkt im Pattern-Editor einzutragen.<br />
<br />
===Effect===<br />
[[Bild:note_properties_effect.png|right]]<br />
Die Effektspalte ist aber sicher die komplexeste von allen. Hier gibt es Myriaden verschiedene Befehle (nagut &ndash; nicht ganz, aber ein paar Dutzend sind es schon), deren Parameter auch noch hexadezimal eingetragen werden müssen und wo aus den Zahlen allein in vielen Fällen gar nicht ersichtlich ist, was dieser Befehl nun mit einem bestimmten Parameter bewirkt. Der '''Note Properties'''-Dialog bietet hier auch Hilfe an (aber auf englisch). Als Beispiel sei hier mal der Befehl {{eff|S9}} erwähnt. Wählt man diesen aus und bewegt nun den Schieberegler, sieht man, dass dieser unscheinbare Befehl [[Soundsteuerung|einiges zu bieten hat]]. So kann man, wenn der Regler auf <code>9F</code> gestellt ist, das Sample an dieser Stelle rückwärts abspielen.<br />
<br />
Wir erweitern noch einmal das Beispiel von vorhin:<br />
<br />
{{seq|D-5|01|v32|S9F}}<br />
<br />
Nun wird unser Cembalo bei halber Lautstärke rückwärts gespielt. Das hat OpenMPT einem antiken Flügel schonmal vorraus ;)<br />
<br />
Nach einer Weile, wenn man sich die entsprechenden Nummern der verschiedenen Effekte eingeprägt hat, kann man ja mehr und mehr dazu übergehen, die Befehle über den Pattern-Editor von Hand einzutragen.<br />
<br />
== Der Parameter-Editor ==<br />
[[Bild:Pattern_editor_linear.png|left]]<br />
[[Bild:Pattern_editor_curve.png|right]]<br />
Möchtest du in einem Kanal einen Slide (z.B. für [[Lautstärke]] oder [[Panning]]) erstellen, kannst du so vorgehen, wie in [[Panning#Panning-Slide mit der normalen Panning-Funktion|diesem Beispiel]] beschrieben. Wenn man das Beispiel befolgt hat, hat man etwo so einen Slide, wie den in der Abbildung links. Mit dem Parameter-Editor kann man die Sache noch ein wenig ''abrunden''. Dafür wählt man den gesamten Bereich aus, wie in der Abbildung rechts zu sehen und gibt danach {{key|Alt}}+{{key|B}} ein oder klickt in dem Kanal die rechte Maustaste und im darauf erscheinenden Menü auf "Visualize Effect".<br />
<br />
Der Slide in der Abbildung auf der linken Seite zieht sich über 64 Zeilen. In der ersten Zeile steht der Befehl {{eff|X00}}, in der 32. {{eff|XFF}} und in der Letzten wieder {{eff|X00}}. Das bedeutet, der Kanal ist erst links zu hören, geht dann über nach rechts (Zeile 32) und wieder zurück nach links. Im Parameter-Editor sieht das wie folgt aus:<br />
[[Bild:Param_editor_linear.png|center]]<br />
Nun kann man im Parameter-Editor die Slider ganz einfach so verschieben, so dass sie eine Kurve ergeben. Dadurch klingt auch der Panning-Slide viel ''natürlicher''. Ohne diese Änderung nimmt man in vielen Fällen besonders ganz links und rechts außen eine abrupte Zu- und Abnahme der Lautstärke wahr. Wie man am Beispiel rechts sehen kann, wurden unsere Änderungen direkt in den Pattern-Editor übernommen &ndash; und nein &ndash; es ist keine perfekte Kurve :).<br />
[[Bild:Param_editor_curve.png|center]]<br />
<br />
<br />
<br />
[[Kategorie:Tutorial]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_Effektparameter_bearbeiten&diff=583
Tutorial: Effektparameter bearbeiten
2009-01-18T16:06:38Z
<p>Cubaxd: </p>
<hr />
<div>In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen.<br />
Für Benutzer, die in Mathe etwas versierter sind, bzw. schon lange mit Trackern arbeiten und die sich mit dem Hexadezimalsystem auskennen, ist der Patterneditor allein zum Eintragen der Parameter in den meisten Fällen ausreichend. Jedoch verfügt OpenMPT auch über Benutzungshilfen, die insbesondere Anfängern das Arbeiten mit dem Programm erleichtern. Auf diese wird in diesem Tutorial näher eingegangen.<br />
<br />
{{Hinweis|Wichtig|Möchtest du die Beispiele in diesem Tutorial nachvollziehen, <br />
<br />
== Der &bdquo;Note Properties&ldquo;-Dialog==<br />
[[Bild:Menutaste.png|right]]<br />
Der '''Note Properties'''-Dialog lässt sich durch einen Klick auf die Menütaste (siehe Abbildung rechts) öffnen. Diese ist unten neben der rechten {{key|Strg}}-Taste zu finden, ist aber nicht auf jeder Tastatur vorhanden. Alternativ kann das Fenster auch durch einen Doppelklick in der Zeile und Spalte des Pattern-Editors, die bearbeitet werden soll, geöffnet werden. Je nachdem, ob man den Dialog von der Note/Instrument-Spalte, der Volume-, oder der Effekt-Spalte öffnet, ist im Fenster der entsprechende Reiter schon geöffnet. Von diesen Reitern gibt es genau 3:<br />
<br />
===Note===<br />
[[Bild:note_properties_note.png|right]]<br />
Hier kann die Note und das Instrument ausgesucht werden.<br />
Wenn wir hier, wie in der Abbildung zu sehen, links die Note {{note|D-5}} und rechts Instrument {{smp|01}} auswählen, dann sehen wir im Pattern-Editor:<br />
<br />
{{seq|D-5|01|...|...}}<br />
<br />
Die Note lässt sich über den Pattern-Editor allerdings viel einfacher und schneller eintragen.<br />
<br />
<br />
===Volume===<br />
[[Bild:note_properties_volume.png|right]]<br />
Links unter '''Volume Command''' kann ein Befehl ausgesucht werden, der in diesem Kanal und in dieser Spalte eingetragen werden soll. Mit dem Schieberegler rechts kann der Wert für den Befehl eingestellt werden. Sucht man z.B. links den Befehl '''v: Set Volume''' aus, kann man rechts mit dem Schieberegler den Parameter zwischen <code>0</code> und <code>64</code> einstellen. Das Instrument, das nun an dieser Stelle gespielt wird, hat jetzt genau die Lautstärke, die vorher mit dem Schieberegler definiert wurde.<br />
<br />
Wenn wir unser Beispiel von vorhin nehmen, hat sich dies nun erweitert zu:<br />
<br />
{{seq|D-5|01|v32|...}}<br />
<br />
Unser Cembalo spielt spielt nun also einen Ton in Zimmerlautstärke. Das schont neben den Boxen auch die Nachbarn.<br />
<br />
Auch hier dürfte es nach einiger Zeit viel leichter und zeitsparender sein, die Befehle und deren Parameter direkt im Pattern-Editor einzutragen.<br />
<br />
===Effect===<br />
[[Bild:note_properties_effect.png|right]]<br />
Die Effektspalte ist aber sicher die komplexeste von allen. Hier gibt es Myriaden verschiedene Befehle (nagut &ndash; nicht ganz, aber ein paar Dutzend sind es schon), deren Parameter auch noch hexadezimal eingetragen werden müssen und wo aus den Zahlen allein in vielen Fällen gar nicht ersichtlich ist, was dieser Befehl nun mit einem bestimmten Parameter bewirkt. Der '''Note Properties'''-Dialog bietet hier auch Hilfe an (aber auf englisch). Als Beispiel sei hier mal der Befehl {{eff|S9}} erwähnt. Wählt man diesen aus und bewegt nun den Schieberegler, sieht man, dass dieser unscheinbare Befehl [[Soundsteuerung|einiges zu bieten hat]]. So kann man, wenn der Regler auf <code>9F</code> gestellt ist, das Sample an dieser Stelle rückwärts abspielen.<br />
<br />
Wir erweitern noch einmal das Beispiel von vorhin:<br />
<br />
{{seq|D-5|01|v32|S9F}}<br />
<br />
Nun wird unser Cembalo bei halber Lautstärke rückwärts gespielt. Das hat OpenMPT einem antiken Flügel schonmal vorraus ;)<br />
<br />
Nach einer Weile, wenn man sich die entsprechenden Nummern der verschiedenen Effekte eingeprägt hat, kann man ja mehr und mehr dazu übergehen, die Befehle über den Pattern-Editor von Hand einzutragen.<br />
<br />
== Der Parameter-Editor ==<br />
[[Bild:Pattern_editor_linear.png|left]]<br />
[[Bild:Pattern_editor_curve.png|right]]<br />
Möchtest du in einem Kanal einen Slide (z.B. für [[Lautstärke]] oder [[Panning]]) erstellen, kannst du so vorgehen, wie in [[Panning#Panning-Slide mit der normalen Panning-Funktion|diesem Beispiel]] beschrieben. Wenn man das Beispiel befolgt hat, hat man etwo so einen Slide, wie den in der Abbildung links. Mit dem Parameter-Editor kann man die Sache noch ein wenig ''abrunden''. Dafür wählt man den gesamten Bereich aus, wie in der Abbildung rechts zu sehen und gibt danach {{key|Alt}}+{{key|B}} ein oder klickt in dem Kanal die rechte Maustaste und im darauf erscheinenden Menü auf "Visualize Effect".<br />
<br />
Der Slide in der Abbildung auf der linken Seite zieht sich über 64 Zeilen. In der ersten Zeile steht der Befehl {{eff|X00}}, in der 32. {{eff|XFF}} und in der Letzten wieder {{eff|X00}}. Das bedeutet, der Kanal ist erst links zu hören, geht dann über nach rechts (Zeile 32) und wieder zurück nach links. Im Parameter-Editor sieht das wie folgt aus:<br />
[[Bild:Param_editor_linear.png|center]]<br />
Nun kann man im Parameter-Editor die Slider ganz einfach so verschieben, so dass sie eine Kurve ergeben. Dadurch klingt auch der Panning-Slide viel ''natürlicher''. Ohne diese Änderung nimmt man in vielen Fällen besonders ganz links und rechts außen eine abrupte Zu- und Abnahme der Lautstärke wahr. Wie man am Beispiel rechts sehen kann, wurden unsere Änderungen direkt in den Pattern-Editor übernommen &ndash; und nein &ndash; es ist keine perfekte Kurve :).<br />
[[Bild:Param_editor_curve.png|center]]<br />
<br />
<br />
<br />
[[Kategorie:Tutorial]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Vorlage:Hauptseite/Inhalt_Tutorials&diff=582
Vorlage:Hauptseite/Inhalt Tutorials
2009-01-18T15:50:06Z
<p>Cubaxd: </p>
<hr />
<div>* [[Tutorial: Effektparameter bearbeiten| Effektparameter bearbeiten]]<br />
* [[Tutorial:_MP3-Konvertierung|Module in MP3s umwandeln]]<br />
<noinclude><br />
<br />
[[Kategorie:Vorlage]]<br />
[[Kategorie:Hauptseite]]<br />
</noinclude></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Param_editor_curve.png&diff=581
Datei:Param editor curve.png
2009-01-18T15:48:04Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Param_editor_linear.png&diff=580
Datei:Param editor linear.png
2009-01-18T15:47:50Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Pattern_editor_curve.png&diff=579
Datei:Pattern editor curve.png
2009-01-18T15:47:36Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Pattern_editor_linear.png&diff=578
Datei:Pattern editor linear.png
2009-01-18T15:47:07Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Note_properties_effect.png&diff=577
Datei:Note properties effect.png
2009-01-18T15:46:49Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Note_properties_volume.png&diff=576
Datei:Note properties volume.png
2009-01-18T15:46:29Z
<p>Cubaxd: </p>
<hr />
<div></div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Datei:Menutaste.png&diff=574
Datei:Menutaste.png
2009-01-18T15:45:56Z
<p>Cubaxd: Abbildund der "Kontextmenü"-Taste
Quelle: selbst erstellt</p>
<hr />
<div>Abbildund der "Kontextmenü"-Taste<br />
<br />
Quelle: selbst erstellt</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Tutorial:_Effektparameter_bearbeiten&diff=573
Tutorial: Effektparameter bearbeiten
2009-01-18T15:43:23Z
<p>Cubaxd: Die Seite wurde neu angelegt: In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen. Für Benutzer, die in ...</p>
<hr />
<div>In diesem Tutorial geht es um das Erstellen von Effekten und wie man deren Parameter am besten bearbeitet. Dabei gibt es mehrere Vorgehensweisen.<br />
Für Benutzer, die in Mathe etwas versierter sind, bzw. schon lange mit Trackern arbeiten und die sich mit dem Hexadezimalsystem auskennen, ist der Patterneditor allein zum Eintragen der Parameter in den meisten Fällen ausreichend. Jedoch verfügt OpenMPT auch über Benutzungshilfen, die insbesondere Anfängern das Arbeiten mit dem Programm erleichtern. Auf diese wird in diesem Tutorial näher eingegangen.<br />
<br />
<br />
== Der &bdquo;Note Properties&ldquo;-Dialog==<br />
[[Bild:Menutaste.png|right]]<br />
Der '''Note Properties'''-Dialog lässt sich durch einen Klick auf die Menütaste (siehe Abbildung rechts) öffnen. Diese ist unten neben der rechten {{key|Strg}}-Taste zu finden, ist aber nicht auf jeder Tastatur vorhanden. Alternativ kann das Fenster auch durch einen Doppelklick in der Zeile und Spalte des Pattern-Editors, die bearbeitet werden soll, geöffnet werden. Je nachdem, ob man den Dialog von der Note/Instrument-Spalte, der Volume-, oder der Effekt-Spalte öffnet, ist im Fenster der entsprechende Reiter schon geöffnet. Von diesen Reitern gibt es genau 3:<br />
<br />
===Note===<br />
[[Bild:note_properties_note.png|right]]<br />
Hier kann die Note und das Instrument ausgesucht werden.<br />
Wenn wir hier, wie in der Abbildung zu sehen, links die Note {{note|D-5}} und rechts Instrument {{smp|01}} auswählen, dann sehen wir im Pattern-Editor:<br />
<br />
{{seq|D-5|01|...|...}}<br />
<br />
Die Note lässt sich über den Pattern-Editor allerdings viel einfacher und schneller eintragen.<br />
<br />
<br />
===Volume===<br />
[[Bild:note_properties_volume.png|right]]<br />
Links unter '''Volume Command''' kann ein Befehl ausgesucht werden, der in diesem Kanal und in dieser Spalte eingetragen werden soll. Mit dem Schieberegler rechts kann der Wert für den Befehl eingestellt werden. Sucht man z.B. links den Befehl '''v: Set Volume''' aus, kann man rechts mit dem Schieberegler den Parameter zwischen <code>0</code> und <code>64</code> einstellen. Das Instrument, das nun an dieser Stelle gespielt wird, hat jetzt genau die Lautstärke, die vorher mit dem Schieberegler definiert wurde.<br />
<br />
Wenn wir unser Beispiel von vorhin nehmen, hat sich dies nun erweitert zu:<br />
<br />
{{seq|D-5|01|v32|...}}<br />
<br />
Unser Cembalo spielt spielt nun also einen Ton in Zimmerlautstärke. Das schont neben den Boxen auch die Nachbarn.<br />
<br />
Auch hier dürfte es nach einiger Zeit viel leichter und zeitsparender sein, die Befehle und deren Parameter direkt im Pattern-Editor einzutragen.<br />
<br />
===Effect===<br />
[[Bild:note_properties_effect.png|right]]<br />
Die Effektspalte ist aber sicher die komplexeste von allen. Hier gibt es Myriaden verschiedene Befehle (nagut &ndash; nicht ganz, aber ein paar Dutzend sind es schon), deren Parameter auch noch hexadezimal eingetragen werden müssen und wo aus den Zahlen allein in vielen Fällen gar nicht ersichtlich ist, was dieser Befehl nun mit einem bestimmten Parameter bewirkt. Der '''Note Properties'''-Dialog bietet hier auch Hilfe an (aber auf englisch). Als Beispiel sei hier mal der Befehl {{eff|S9}} erwähnt. Wählt man diesen aus und bewegt nun den Schieberegler, sieht man, dass dieser unscheinbare Befehl [[Soundsteuerung|einiges zu bieten hat]]. So kann man, wenn der Regler auf <code>9F</code> gestellt ist, das Sample an dieser Stelle rückwärts abspielen.<br />
<br />
Wir erweitern noch einmal das Beispiel von vorhin:<br />
<br />
{{seq|D-5|01|v32|S9F}}<br />
<br />
Nun wird unser Cembalo bei halber Lautstärke rückwärts gespielt. Das hat OpenMPT einem antiken Flügel schonmal vorraus ;)<br />
<br />
Nach einer Weile, wenn man sich die entsprechenden Nummern der verschiedenen Effekte eingeprägt hat, kann man ja mehr und mehr dazu übergehen, die Befehle über den Pattern-Editor von Hand einzutragen.<br />
<br />
== Der Parameter-Editor ==<br />
[[Bild:Pattern_editor_linear.png|left]]<br />
[[Bild:Pattern_editor_curve.png|right]]<br />
Möchtest du in einem Kanal einen Slide (z.B. für [[Lautstärke]] oder [[Panning]]) erstellen, kannst du so vorgehen, wie in [[Panning#Panning-Slide mit der normalen Panning-Funktion|diesem Beispiel]] beschrieben. Wenn man das Beispiel befolgt hat, hat man etwo so einen Slide, wie den in der Abbildung links. Mit dem Parameter-Editor kann man die Sache noch ein wenig ''abrunden''. Dafür wählt man den gesamten Bereich aus, wie in der Abbildung rechts zu sehen und gibt danach {{key|Alt}}+{{key|B}} ein oder klickt in dem Kanal die rechte Maustaste und im darauf erscheinenden Menü auf "Visualize Effect".<br />
<br />
Der Slide in der Abbildung auf der linken Seite zieht sich über 64 Zeilen. In der ersten Zeile steht der Befehl {{eff|X00}}, in der 32. {{eff|XFF}} und in der Letzten wieder {{eff|X00}}. Das bedeutet, der Kanal ist erst links zu hören, geht dann über nach rechts (Zeile 32) und wieder zurück nach links. Im Parameter-Editor sieht das wie folgt aus:<br />
[[Bild:Param_editor_linear.png|center]]<br />
Nun kann man im Parameter-Editor die Slider ganz einfach so verschieben, dass sie eine Kurve ergeben. Dadurch klingt auch der Panning-Slide viel ''natürlicher'':<br />
[[Bild:Param_editor_curve.png|center]]<br />
<br />
<br />
<br />
[[Kategorie:Tutorial]]</div>
Cubaxd
https://wikide.openmpt.org/index.php?title=Panning&diff=572
Panning
2009-01-18T14:33:58Z
<p>Cubaxd: /* Panning-Slide */</p>
<hr />
<div>{{Effektinfo|Panning|Die Position eines Kanals im Stereospektrum bestimmen|X<br />S8|X<br />S8|8<br />E8|8<br />E8}}<br />
Durch das '''Panning''' ''(schwenken, verschieben)'' lässt sich die Soundausgabe eines jeden Kanals im Stereospektrum individuell einstellen.<br />
<br />
In IT-, MPTM-, und S3M-Modulen heißt der Befehl {{eff|X}} und in MOD- und XM-Modulen {{eff|8}}.<br />
<br />
Der Befehl {{eff|S8}} bzw. {{eff|E8}} hat nur eine geringe Genauigkeit (4 Bit).<br />
<br />
== Kompatiblität ==<br />
Zunächst ein Hinweis für alle MOD- und S3M-Liebhaber: Das originale MOD-Format kennt keine Panning-Befehle (da die vier Soundkanäle Paula-Chips fest definierte Panning-Positionen hatten), S3M kennt nur S8x, und dies war auch zur Zeit von Scream Tracker nur auf der Gravis Ultrasound-Karte möglich, die 16 Panning-Positionen bot. PC-Tracker haben das MOD-Format um Panning-Befehle ergänzt und Impulse Tracker führte den {{eff|X}}''xx''-Befehl im S3M-Format ein. Bedenke dies, wenn du z.B. Musik für den Amiga schreiben (MOD) oder valide S3M-Dateien erstellen willst!<br />
<br />
== Definition ==<br />
Wenn einem Sample oder Instrument eine feste Position im Stereospektrum zugewiesen wurde (entweder unter '''[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Set Pan]]''' bei einem Sample oder in der Einstellung '''[[Handbuch:_Instrumente#General|Pan]]''' bei einem Instrument), kann diese Einstellung durch den Befehl {{eff|X}} bzw. {{eff|8}} umgangen werden. Wird jedoch im selben Kanal das Instrument erneut gespielt ohne den Effekt mit anzugeben, sind die Panning-Werte wieder die des Instrumentes/Samples. Wenn einem Instrument oder Sample kein Pan-Wert zugewiesen wurde, verbleibt das Panning an der Position, die vorher durch {{eff|X}} bzw. {{eff|8}} oder eben die Panning-Einstellung des zuletzt gespielten Instrumentes/Samples definiert wurde, und zwar so lange, bis der Effekt erneut ausgeführt, oder ein Instrument bzw. Sample gespielt wird, dem ein Pan-Wert zugewiesen wurde.<br />
<br />
Ein Beispiel: In einem IT-Modul wurde Instrument 1 im Instrument-Editor der Pan-Wert 64 zugewiesen, was im Stereospektrum genau zwischen Links und der Mitte liegt. Für Instrument 2 wurde jedoch keine Position spezifiziert. Instrument 3 hat einen Wert von 192, was genau zwischen der Mitte und Rechts ist.<br />
<br />
{{seq|C-5|01|...|...}}: Instrument 1 wird gespielt, Dieses ist nun halb links zu hören und der Kanal hat sich darauf eingestellt.<br />
<br />
{{seq|C-5|02|...|...}}: Instrument 2 wurde kein Panning-Wert zugewiesen, daher hört man dieses nun an der selben Position wie Instrument 1.<br />
<br />
{{seq|C-5|03|...|...}}: Nun folgt Instrument 3, welches weiter rechts zu hören ist.<br />
<br />
{{seq|C-5|02|...|...}}: Jetzt ist auch Instrument 2 rechts zu hören.<br />
<br />
{{seq|C-5|02|...|X80}}: Wird Instrument 2 unmittelbar danach noch einmal gespielt, ist es auch jetzt auf der rechten Seite hörbar, es sei denn, man setzt, wie in diesem Beispiel, einen neuen Panning-Wert, was in diesem Fall das Instrument in der Mitte hörbar macht (siehe auch die Tabelle weiter unten).<br />
<br />
In der linken Effektspalte (''Volume Column'') kann das Panning mittels {{vol|p}} eingegeben werden. Dieser Befehl verhält sich ähnlich, hat jedoch ''wahrscheinlich'' (weiss nicht :-D ) nur ein Viertel der Genauigkeit, da es dort nur 65 verschiedene Werte gibt (im Gegensatz zu den 256 in der eigentlichen Effektspalte).<br />
<br />
== Das Stereospektrum ==<br />
<div style="position:relative; float:right; margin-left:12px; width:540px;"><br />
{|width="100%" style="border:1px solid #444; background-color:#fff;" cellspacing="1" cellpadding="4"<br />
|width="40%" style="background-color:#ccc;"|<br />
|width="12%" style="background-color:#d77;text-align:center;"|<<<br />
|width="12%" style="background-color:#db7;text-align:center;"|<<br />
|width="12%" style="background-color:#bd7;text-align:center;"|o<br />
|width="12%" style="background-color:#db7;text-align:center;"|><br />
|width="12%" style="background-color:#d77;text-align:center;"|>><br />
|-<br />
|style="background-color:#eee; font-family:"|Volume Column ({{vol|p}}) (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|X}}/{{eff|8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|00<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|40<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|80<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C0<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|FF ¹<br />
|-<br />
|style="background-color:#eee;"|Effect Column ({{eff|S8}}/{{eff|E8}}) (hex)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|4<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|8<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|C<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|F ¹<br />
|-<br />
|style="background-color:#eee;"|[[Handbuch:_Instrumente#General|Instrument-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|64<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|128<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|192<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|256<br />
|-<br />
|style="background-color:#eee; font-family:"|[[Handbuch:_Samples#Lautstärke,_Panning_und_Frequenz|Sample-Editor]] (dez)<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|0<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|16<br />
|style="text-align:right;background-color:#df9;font-family:monospace;"|32<br />
|style="text-align:right;background-color:#fd9;font-family:monospace;"|48<br />
|style="text-align:right;background-color:#f99;font-family:monospace;"|64<br />
|}<br />
¹ ''Im Pattern-Editor lässt sich ein Wert nur bis <code>FF</code> (255) bzw. <code>F</code> (15) eingeben. Eine genaue Mitte scheint es hier also nicht zu geben (sofern man davon ausgeht, dass der niedrigste Wert <code>0</code> ist und auch alle Werte belegt sind (?)).''<br />
</div><br />
<br />
Diese Tabelle soll verdeutlichen, wie man in OpenMPT die Position im Stereospektrum festlegt.<br />
<br clear="all" /><br />
<br />
== Panning-Slide ==<br />
<div style="border:1px solid #b1aba0; position:relative; float:right; padding:4px; width:160px; background-color:#eee; margin-left:12px;"><br />
In diesem Beispiel eines Panning-Slides verläuft die Soundausgabe von ganz links nach ganz rechts.<br />
<hr /><br />
<div style="border:1px solid #918b80;background-color:#f1ebe0;padding:4px;"><br />
<span style="font:12px courier;">ModPlug Tracker IT</span><br /><br />
{{seq1|...|..|...|X00}}<br /><br />
{{seq|...|..|...|X11}}<br /><br />
{{seq|...|..|...|X22}}<br /><br />
{{seq|...|..|...|X33}}<br /><br />
{{seq1|...|..|...|X44}}<br /><br />
{{seq|...|..|...|X55}}<br /><br />
{{seq|...|..|...|X66}}<br /><br />
{{seq|...|..|...|X77}}<br /><br />
{{seq1|...|..|...|X88}}<br /><br />
{{seq|...|..|...|X99}}<br /><br />
{{seq|...|..|...|XAA}}<br /><br />
{{seq|...|..|...|XBB}}<br /><br />
{{seq1|...|..|...|XCC}}<br /><br />
{{seq|...|..|...|XDD}}<br /><br />
{{seq|...|..|...|XEE}}<br /><br />
{{seq|...|..|...|XFF}}<br /><br />
</div><br />
</div><br />
Es gibt mehrere Möglichkeiten, einen Panning-Slide zu erstellen. Zum einen kann man den Befehl {{eff|X}}/{{eff|8}} benutzen, den Befehl {{vol|p}} in der linken Effektspalte, oder man verwendet die eigens dafür vorgesehene [[#Die Panning-Slide-Funktion|Panning-Slide-Funktion]] {{eff|P}}.<br />
<br />
=== Panning-Slide mit der normalen Panning-Funktion ===<br />
Im Kasten rechts sieht man ein Beispiel eines Panning-Slides. In diesem verläuft die Ausgabe des Kanals von ganz links nach ganz rechts. Beachten sollte man hier, dass die Werte nicht allzu weit auseinander liegen dürfen (es sei denn, es ist Absicht), da das Panning sonst sehr ruckartig verläuft. Dies nimmt man umso besser wahr, je langsamer das Modul abspielt. Das Beispiel rechts sollte also nicht als Vorbild dienen :).<br />
<br />
Erstellen lässt sich solch ein Slide, indem man an der Anfangsposition des Bereichs ein {{eff|X}} einfügt und den gewünschten Startwert dahinter schreibt, also beispielsweise {{eff|X00}}. Dies wiederholt man nun noch einmal an der vorgesehenen Endposition mit dem Endwert, z. B. {{eff|XFF}}. Nun wählt man den gesamten Bereich aus, indem man mit der Maus auf den ersten Wert geht und dann die Maustaste gedrückt hält und die Maus über den gesamten Bereich zieht. Dabei muss man darauf achten, dass die Auswahl nicht über die Start- und Zielposition hinausgeht. Wenn man nun {{key|Strg}}+{{key|K}} drückt, sollte der Bereich dazwischen mit den entsprechenden Werten gefüllt werden. Dies funktioniert allerdings nur an Positionen, die nicht mit einem anderen Befehl belegt sind. Alternativ zu Tastenkombination {{key|Strg}}+{{key|K}} kann man auch, nachdem man den Bereich ausgewählt hat, die rechte Maustaste drücken und im danach erscheinenden Menü <code>"Interpolate Effect"</code> auswählen.<br />
<br />
=== Die Panning-Slide-Funktion ===<br />
<br />
{{eff|P1F}}-{{eff|PEF}}: langsam bis mittelschnell nach links<br /><br />
{{eff|P10}}-{{eff|PF0}}: schnell bis sehr schnell nach links<br /><br />
{{eff|PF1}}-{{eff|PFE}}: langsam bis mittelschnell nach rechts<br /><br />
{{eff|P01}}-{{eff|P0F}}: schnell bis sehr schnell nach rechts<br /><br />
<br />
Nachdem dieser Effektbefehl einmal mit Parameter aufgerufen wurde, braucht danach für die Dauer des Slides nur noch der Befehl {{eff|P00}} zu stehen. Da der Wert <code>00</code> bei diesem (und vielen anderen) Effekten nicht definiert ist, wird der zuletzt gültige Wert ausgeführt. Also ist:<br /><br />
{{Effektinfo|Panning-Slide|Panning-Slide-Funktion|P|P|P|}}<br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
gleichbedeutend mit:<br /><br />
{{seq|...|..|...|P1F}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
{{seq|...|..|...|P00}}<br /><br />
<br />
[[Kategorie:Effekt]]</div>
Cubaxd