Ein einfacher Synthesizer/Tracker
(Hinweis: dieses Projekt wurde zuerst im DF vorgestellt)
Einführung
Nach dem Lesen dieses Tutorials von Delphic/Nico Michaelis, und nach dem Testen der mitgelieferten Samples hab ich mich auch mal dran gemacht, einen einfachen Tracker zu schreiben. Dabei kam richtiges C64/Amiga Feeling auf….
Mithilfe Midi-ähnlicher Tracker-Dateien werden in Echtzeit die Lieder abgespielt, die man mehr oder weniger komfortabel erstellt hat.
Zur Technik: die Events(Note An/aus usw.) werden in verschiedenen Tracks erstellt. Vor dem Abspielen mithilfe der fmod-dll werden die Tracks vorkompiliert, damit man damit was anfangen kann. Instrumente gibts im Moment folgende:
// ++---- category
//Synthethic // ||++-- instrument
Synth_Instr_Sine = $0000;
Synth_Instr_Triangle = $0001;
Synth_Instr_Sawtooth = $0002;
Synth_Instr_Pulse = $0003;
Synth_Instr_Noise = $0004;
//Keys
Synth_Instr_Piano = $0100;
Synth_Instr_Clavinet1 = $0101;
Synth_Instr_Clavinet2 = $0102;
Synth_Instr_EOrgan = $0103;
//Woodwind
Synth_Instr_Flute = $0200;
Synth_Instr_Trumpet = $0201;
//Percussion
Synth_Instr_Bell = $0300;
Synth_Instr_Drum = $0301;
Synth_Instr_SynthDrum = $0302;
Synth_Instr_Snare = $0303;
Synth_Instr_Hat = $0304;
Zur Bedienung des Editors: in der Events-Liste spielt sich fast alles über die rechte Maustaste ab. Es gibt kein Undo/Redo (wäre auch recht schwierig), also lieber Sicherungskopien speichern!
Der Editor ist nicht OpenSource, da die da drin verwendeten Komponenten 1. keiner hat und 2. ich sie nicht veröffentlichen kann, da sie „zusammenkopiert“ sind, zumindest eine. Außerdem gibts da nichts interessantes 😉
Der Tracker selbst wird aber als OpenSource veröffentlicht. Der Code dürfte Nico etwas bekannt vorkommen, die eigentliche Tonerzeugung ist aus dem genannten Tutorial.
Wer Kommentare, Fehler oder sonst Feedback hat, immer her damit!
Auch wenn ich nicht weiß, ob ich noch mehr Instrumente mache. Es soll schon das Electro-Musik-Feeling da bleiben …
Changelog
Update 6 (2008-04-22)
*Änderung des BT-Dateiformats (Version 1->2), noch mehr Redundanzen beseitigt
*BT-Dateien haben jetzt Versionssignatur, ab diesem Update aufwärts wird alles (lese-)kompatibel sein!
*Timeline-Editor
*Neue Instrumente: Drumkit
*BTS: Repeat-Bug gefixt
Update 5 (2007-11-27)
*Änderung des BTS Formats bzgl. NoteDelay
*Änderung des BT-Dateiformats, Redundanzen beseitigt
Update 4 (2007-11-26)
+BTS – BlitzTrackerScript
Update 2/3:
*Komische Fehler behoben
Update 1:
+Rauschen als Wellenform
+Lautstärke über Volume-Events
+kleinere Fixes
Downloads
BlitzTracker-Core: (Delphi-Src, 10kb) Synth_src.zip
Der Synthie mit Beispielen: (Exe+bt+bts, 520kb) Synth.zip
Der Editor
Seit Update 6 gibt es einen Timeline-basierten Editor. Dessen Darstellung ist an die Midi-Editor-Typischen „Piano Rolls“ angelehnt. Es werden alle Tracks untereinander dargestellt, der aktuelle ist dabei ausgeklappt. Nur dieser kann auch bearbeitet werden.
Die Bedienung ist komplett Maus-basiert. Mit der mittleren Maustaste kann ein Track auf-und zu geklappt werden. Mit der linken Maustaste kann man einen Bereich markieren. Erfasste Events werden invertiert dargestellt. Die rechte Maustaste ruft verschiedene Menüs auf.
Auf einem Event ist dies der Event-Editor, über den die Events bearbeitet werden und ihr Typ verändert werden kann.
Auf einer freien Fläche im Track wird ein Menü aufgerufen, über das man Events einfügen und löschen kann. Dabei wirken die unteren beiden Optionen nicht-Destruktiv, es werden also Events nach den gelöschten angepasst, so dass ihre Position konstant bleibt.
Unter den Tracks oder auf der linken Kontrollfläche der Tracks wird das Track-Menü aufgerufen, über das man den Track bearbeiten und das verwendete Instrument wechseln kann.
Im Gegensatz zu Vorversionen kann man jetzt auch die Abspielposition mit einem Klick festlegen, so dass der Player dort beginnt.
BlitzTrackerScript
BlitzTrackerScript(oder kurz BTS) ist die neueste Errungenschaft von BlitzTracker (Update 4). Durch BTS wird es einfacher, Noten in BlitzTracker zu importieren, da einem vieles abgenommen wird.
BTS ist wie eine INI-Datei in Sektionen aufgebaut.
[Song]
Title={Songtitel}
Creator={Autor}
Composer={Komponist}
Tempo={Geschwindigkeit in BPM}
TrackCount={Anzahl der Tracks}
Für jeden Track gibts es jetzt, beginnend bei Index 0 eine Track-Sektion:
[Track0]
Name={Name des Tracks}
NoteDelay={Abstand zwischen Tönen in 64steln, 0 für Legato.}
Instr={Instrumenten-ID als Hex-Wert ohne Prefix}
Notes={Noten-Sequenz}
Das interessanteste dürften die Noten-Sequenzen sein, denn sie sind fast eine eigene kleine Skriptsprache. Ein kleines Beispiel:
Notes=g,a,c,d,e,p,[e,f,g],hb,{refrain},a,1/2g,h,4/4c1
Diese Sequenz ist bis zur ersten eckigen Klammer wohl noch recht verständlich. Es werden die ungestrichenen Noten g,a,c,d,e gespielt, dann folgt eine Pause. Jede ist 1/4 lang, dies ist der Standard wenn keine Länge explizit angegeben wurde.
Dann folgt ein mit [] umschlossenes Segment. Dies stellt eine Wiederholung dar. Es wird also e,f,g,e,f,g gespielt. [] kann auch verschachtelt werden: [[]] wiederholt 2 mal, [[[]]] wiederholt 3 mal usw.
Als nächstes folgt ein h mit dem (nachgestellten) Vorzeichen b. In geschweiften Klammern wird jetzt ein sogenanntes Modul eingebunden.
Module sind Bausteine, die jeweils wieder für bestimmte Notensequenzen stehen. Module können auch verschachtelt werden, so kann modul1 {modul2} einbinden. Bei Rekursiven Bezügen bricht der Importer ab.
Definiert werden Module als Sektionen mit dem Modultitel, die Sequenz steht wie immer im Notes-Schlüssel.
Als besondere Form des Modul-Einbindens existieren sogenannte Modifier. Diese können auf ein Modul(und alle untergeordneten) vor dem Import angewendet werden. Sie werden mit Komma getrennt nach dem Namen des Moduls angegeben.
Modul:
transpose(halftones) Verschiebt das Modul um halfones Halbtöne nach oben/unten.
stretch(percent) Verändert alle Längenangaben um den in Prozent (100=Originallänge) angegeben Faktor
Beispiel (melodie wird eine Terz nach oben verschoben): Notes={melodie,transpose(3)}
Zurück zum Beispiel: nach dem Spielen von einer Viertelnote a folgt eine Halbe g, eine Viertel h und eine Ganze eingestrichene c. Für die Ganze hätte man auch 1/1, 2/2 o.ä. schreiben können, da diese Brüche immer ausgerechnet werden. So sind auch exotische Längen möglich, aber auch punktierte noten wie 3/4 für eine punktierte Halbe.
Fazit
Sollten jemand mit diesem Tracker die 9. Schreiben, würde ich das gerne hier präsentieren. „Alle meine Entchen“ genauso 😉
Genauso würde es mich freuen, wenn jemand neue Instrumente auf Basis der im Core-Paket angebenen Syntax geschrieben hat und die zur Verfügung stellen möchte.
Ach ja: für eventuelle Ohren-, Scheiben- oder Gläserschäden aufgrund fieser oder lauter Töne hafte ich nicht!