Ooops. An die "Einbettung in eine moderne Multitasking-Umgebung" habe ich gar nicht gedacht (sondern: "Platz da, hier kommt 'Play' ")
Werde ich noch ändern.
Bevor ich einen Sound Editor bastele, werde ich zunächst noch die Funktionsvielfalt erhöhen. Bisher sind mir eingefallen:
R = Reset to Anfangszustand (Instrument,Attack,Sound,Legato, Length, Octave,...)
_ = Haltebogen zwischen zwei (denselben) Noten (um sie zu verlängern)
|: (...) : | = Wiederholungszeichen
|: (...) : |[x/y;z/q] = Wiederholung mit Ersetzungen im Teil (z.B. für Instrument/Oktave-Änderungen, hier x durch y und y durch q)
[x/y;z/q] = Ersetzungen bis zum Ende des Songs (x durch y und y durch q)
[] = alle Ersetzungen aufheben.
(also R[] = Reset und alle Ersetzungen aufheben)
Yxx = 'Y' = sYnchronize, xx = integer
Beim Mixen von Songs werden (chronologisch) dieselben Yxx-Marken aneinandergelegt, so kann man z.B. eine 'Spur' auch mal längere Zeit aussetzen lassen, ohne sie mit der entsprechenden Anzahl Pausen aufzufüllen.
\* (...) *\ = Kommentar
?xx = Marker mit ID xx. Wird auch als Marker in die WAV-Datei geschrieben.
?/*Titel*/xx = Marker mit ID xx. Wird zusammen mit 'Titel' in die WAV-Datei geschrieben.
(Bei beiden weiß ich noch nicht, ob es Sinn macht, die ID explizit angeben zu müssen, vielleicht ist es besser, das automatisch zu machen)
|| = Ende der 'Spur' => Springe zeitlich wieder an den Anfang und führe R[] aus. Alles folgende wird dem bereits bestehenden zugemischt: So lassen sich mehrere Spuren in nur einem String erzeugen.
KEY[PlayStringOhneNoten] = setze Keyframe. Von diesem aus werden bis zum nächsten alle darin enthaltenen Angaben zeitlich linear interpoliert. So lassen sich dann Lautstärkeverläufe, etc. realisieren.
Dann steht auf der ToDo-Liste, der buffered Stream-Output (entweder per fmod, oder wirklich 'per Hand' mit WinAPI), so dass man den Song gleich starten & hören kann, während er im Hintergrund weiter berechnet wird.
(Das klappt dann aber nur, wenn man mit QBPlay() direkt einen String wiedergeben möchte, nicht wenn man erst mehrere separate erzeugt, und später im Programm per QBPlay_Mix mixt. Vielleicht bekomme ich das aber auch mit dem || so hin, dass man die QBPlay_Mix - Funktion gar nicht mehr braucht, und die Sofortwiedergabe damit funktioniert.)
Achso, nochwas: Anstelle eines Strings kann eine Textdatei oder ein Pointer an QBPlay übergeben werden (u.a. um das 64k-Limit von PB zu knacken).
Natürlich folgen dann noch einige weitere Instrumente, sowie ein Minimini - Drumset, und bis zu 16(?) Callback-Funktionen für nachträglich selbst-erstellbare Instrumente. (Die Funktion bekommt einfach dieselben Daten wie QBPlay_WriteNote() übermittelt und erwartet einen generierten Sound.)
Außerdem einige hauseigene Effekte und andere Samplewertveränderungen (Normalize, FadeIn, FadeOut, Chorus, Echo, Reverb), welche auf den gesamten Song angewandt werden.
Dann erfolgt eine MIDIfizierung in beide Richtungen (MIDI2PlayString und PlayString2MIDI)
Auch wird dann ein eigenes Sampleformat eingeführt, welches sich über PlayStrings abspielen läßt.
Und schließlich folgt der Mehrspur-Soundeditor.
Dann werden die ersten Mega-Retro-Platten herausgebracht, welche ausschließlich mit PlayStrings arbeiten (Funktionsaufruf lediglich: QBPlay(...) ) und die Charts stürmen. Zusammen mit dem noch ausstehenden 'Vocalizer'-Befehl ( VOX[DiesenTextBitteSingen] ) sicher kein Problem. Eine CD-ROM dürfte dann so ca. einige Jahre Musikmaterial enthalten können, wenn man nur die PlayStrings zusammen mit einem kleinen Player draufpackt.
Hat sonst noch wer Ideen ?
Abgabetermin ist der 11.11. (mal sehen, welches Jahr

)