# ANSI music

Als ANSI music, englisch für ANSI-Musik, wird eine Erweiterung zu ANSI-BBS bezeichnet, mit der per ANSI-Escapesequenzen einfache Melodien auf dem PC-Lautsprecher ausgeben werden können.

## BBS-Clients und ANSI-Treiber

ANSI-Musik war nur auf Bulletin Board Systems, kurz BBS, verbreitet und benötigt einen BBS-Client oder einen ANSI-Treiber, der ANSI music unterstützt. Programme dafür blieben hauptsächlich auf PC-kompatibles DOS wie MS-DOS beschränkt. Nur wenige dieser Programme wurden auch auf Windows 9x und Windows NT portiert. Bekannte DOS-Programme mit ANSI-Musik-Unterstützung:
* QModem
* Telemate
* CI Link
* Slick Terminal
* SMT
* QCom
* BananaCom
Einfache Programme mit Unterstützung für ANSI music unter DOS sind A_TYPE, eine Umsetzung von TYPE, der ANSI-Treiber ANSIALL sowie das Abspielprogramm ANSIPLAY.

## Aufbau
### ANSI-Escapesequenz

Der Aufbau der Musik-Funktion ist als Erweiterung für ANSI.SYS angelegt und wird mit der Escapesequenz CSI, Control Sequence Intro, eingeleitet, gefolgt vom Buchstaben N. Die ursprüngliche Einleitung war ←[M, diese ist allerdings in ANSI X3.64 bzw. ECMA-48 bereits für SGR0, Zeichenattribute ausschalten, vergeben, weshalb in späteren Versionen (ab Mitte der 1990er Jahre) die Einleitung ←[N verwendet wird. ANSI-BBS-Programme der späten 1990er Jahre können meist jedoch beide Varianten korrekt interpretieren.
Bei ANSI-CSI-Escapesequenzen wird die Funktion erst mit dem letzten Zeichen festgelegt. ANSI music verwendet dafür Strg+N unter DOS, was ASCII SO an Position 14 dezimal bzw. 0E hexadezimal entspricht. DOS-üblich ist die Schreibweise ^N. Esc wird in DOS in den meisten Texteditoren mit dem Linkspfeil ← dargestellt.
Der gesamte Aufbau von ANSI-Musik folgt damit der ANSI-Escapesequenz CSI:
Das entspricht dezimal 027 091 078 <Musik-Befehle...> 014 oder hexadezimal 1B 5B 4E <Musik-Befehle...> 0E.

### Musik-Befehle und Syntax

Für die Tonausgabe ist ANSI music angelehnt an die Funktion PLAY von BASIC. Da in MS-DOS bis Version 4.01 GW-BASIC enthalten ist, kann ein Musikstück relativ einfach vorab erstellt und dann in einem Texteditor in eine ANSI-Escapesequenz übertragen werden. Bei späteren MS-DOS-Versionen ist dessen Nachfolger QBasic enthalten.
ANSI-Musik-Befehle :
| A-G | Note aus der Tonleiter; Beispiel C-Dur: C D E F G A B |
| P | Pause (kein Ton) |
| + oder # | ♯ (englisch sharp) – einfache Erhöhung um einen Halbtonschritt; muss auf eine Note folgen |
| - | ♭ (englisch flat) – einfache Erniedrigung um einen Halbtonschritt; muss auf eine Note folgen |
| . | punktierte Note – die Note wird um die Hälfte ihrer Dauer verlängert; muss auf eine Note oder Pause folgen; mehrere Punkte sind möglich |
| Tnnn | Tempo, nnn zwischen 32 und 255; Voreinstellung: 120 |
| On | Oktave Nummer n; Voreinstellung: Oktave 3 |
| < oder > | Oktave um eins erniedrigen (<) oder erhöhen (>). |
| Lnn | Länge (englisch length) oder Dauer (englisch duration) des Tons, entspricht dem Verhältnis zwischen Note/Pause; Voreinstellung: 4 |
| MF und MB | Musik im Vordergrund (englisch foreground) oder Musik im Hintergrund (englisch background), die Voreinstellung ist normalerweise als Hintergrundprozess. |
| MN | Musik Normal, setzt die Dauer auf 7/8 per L-Befehl |
| ML | Musik Legato, setzt die Dauer auf voll (1/1) per L-Befehl |
| MS | Musik Staccato, setzt die Dauer auf 3/4 per L-Befehl |
Zum Schreiben der Noten gibt es zwei Methoden:
* mit Setzten einer Tonlänge per Längen-Befehl L oder
* mit Tonlängenangabe nach jeder Note.
Die Lesbarkeit der programmierten Noten ist bei Verwenden des Tonlängen-Befehls geringer.
Am Beispiel der ersten Zeile des Lieds Mary Had a Little Lamb, nach der 1. Methode mit Längen-Befehl:
Und nach der 2. Methode mit der Tonlänge nach jeder Note:
Der vollständige ANSI-Musik-Befehl für diese Liedzeile kann wie folgt aussehen:

### Teil einer ANSI-Escapesequenz

Weil ANSI-Musik sonst die Textausgabe auf dem Monitor unterbricht und eventuell zu Darstellungsproblemen führt, sollten vor der Musik-Ausgabe die aktuelle Zeilen-Position und die Attribute gesichert werden, und danach zurückgesetzt. Das erledigen die ANSI-Escapesequenzen ←[s ←[8m vor dem Musikteil und ←[u ←[a ←[0m danach.
ANSI-Escapesequenzen gem. ANSI X3.64 :
| ←[s | Speichert die aktuelle Zeile (englisch column), in der sich der Cursor befindet. |
| ←[8m | Unterbindet die Ausgabe auf dem Bildschirm (Zeichenattribut „unsichtbar“, englisch invisibility). |
| ANSI music... Beispiel: ←[Ncdefgab^N ||
| ←[u | Setzt den Cursor in die zuvor mit ←[s gespeicherte Zeile zurück. |
| ←[a | Setzt den Cursor an den Anfang der aktuellen Zeile. |
| ←[0m | Setzt die Zeichenattribute zurück (nicht mehr unsichtbar). |

### Groß-/Kleinschreibung

Der englische Begriff case sensitivity beschreibt, wie ein System mit Groß- und Kleinschreibung umgeht. DOS ist traditionell case insensitive, es ist also nicht relevant, ob ein Großbuchstabe oder ein Kleinbuchstabe geschrieben wird. Dadurch bedeutet ←[M dasselbe wie ←[m und auch die Noten können sowohl groß als auch klein geschrieben werden.