Neben den 16 Software-Volumenhüllkurven gibt es auch noch 16, fast völlig entsprechend aufgebaute Der Sound Manager: Frequenz-Hüllkurven BCBF: SOUND TONE ENVELOPE: Der Parameterblock der Frequenz-Hüllkurve:Frequenz-Hüllkurven.
Die nicht veränderliche Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Hüllkurve 0, die von Einleitung: BASIC Anhang: BasicBasic auch immer als Default angenommen wird, erzeugt einen Ton konstanter Frequenz.
Bei den 15 selbst definierbaren Der Sound Manager: Frequenz-Hüllkurven BCBF: SOUND TONE ENVELOPE: Der Parameterblock der Frequenz-Hüllkurve:Frequenz-Hüllkurven kann man wieder insgesamt 5 Abschnitte definieren, für die man jeweils Schrittzahl, Schritthöhe und Schrittdauer angeben muss.
Die Programmierung dieser Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Hüllkurven geschieht dabei in Maschinensprache wieder auf fast identische Weise:
+------------------------------------------------------+
! Basic und Maschinencode: ParameterParameter der Tonperioden-Hüllkurven !
+------------------------------------------------------+
! !
! Einleitung: BASIC Anhang: BasicBASIC: ENT (-)nummer, SZ1,SH1,SL1, ... SZ5,SH5,SL5 !
! MCode: Vektor &SOUND MANAGER: BCBF: SOUND TONE ENVELOPEBCBF: Operationen: BD5B / 349A / 349A: FLO SUBA=Nummer HL -> Datablock !
! !
!HL -> DEFB ANZ = Anzahl Hüllkurvenabschnitten !
! Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 7 = 1 --> Wiederholend !
! DEFB SZ1 \ !
! DEFB SH1 > Basic und Maschinencode: ParameterParameter des ersten Abschnittes !
! DEFB SL1 / !
! ... ... !
! DEFB SZ5 = Schrittzahl !
! DEFB SH5 = Schritthöhe (Änderung d. P.Len.) !
! DEFB SL5 = Schrittlänge (Dauer) !
+------------------------------------------------------+
Für die Basic und Maschinencode: ParameterParameter der einzelnen Abschnitte gelten wieder ähnliche Grenzen:
- Schrittzahl: 0 ... 239 (0 entspricht 1)
- Schrittweite -128 ... +127
- Schrittlänge: 0 ... 255 (0 entspricht wieder 256)
Das ganze funktioniert wie beim ENV-Kommando. Nur dass sich die Änderungen jetzt auf die Der Sound Manager: PeriodenlängePeriodenlänge, also die Frequenz der ausgegebenen Note beziehen.
Ist, bei der Programmierung in Maschinensprache, im ersten Datentypen: Bytes Datenbreite: BytesByte (= Anzahl) das siebte Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit gesetzt, so wird damit eine Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Hüllkurve definiert, die sich bei Bedarf beliebig oft wiederholen kann. Ist die Der Sound Manager: Frequenz-Hüllkurven BCBF: SOUND TONE ENVELOPE: Der Parameterblock der Frequenz-Hüllkurve:Frequenz-Hüllkurve fertig abgespielt, bevor ein Ton komplett abgespielt ist, so wird sie von vorne wiederholt. In Einleitung: BASIC Anhang: BasicBasic wird das mit einer negativen Hüllkurven-Nummer festgelegt:
ENT -5, ....
Ist dieses Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit nicht gesetzt, so wird nach Ablauf der Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Hüllkurve die Frequenz des Tones nicht mehr geändert.
Ungünstig, aber ohne unverhältnismäßig hohem Aufwand nicht zu umgehen, ist dabei, dass die Änderung der Der Sound Manager: PeriodenlängePeriodenlänge linear ist, während die einzelnen Noten einer Periodenlängen der Noten aus 9 Oktaven: Oktave -4 Periodenlängen der Noten aus 9 Oktaven: Oktave -3 Periodenlängen der Noten aus 9 Oktaven: Oktave -2 Periodenlängen der Noten aus 9 Oktaven: Oktave -1 Periodenlängen der Noten aus 9 Oktaven: Oktave +0 Periodenlängen der Noten aus 9 Oktaven: Oktave +1 Periodenlängen der Noten aus 9 Oktaven: Oktave +2 Periodenlängen der Noten aus 9 Oktaven: Oktave +3 Periodenlängen der Noten aus 9 Oktaven: Oktave +4Oktave in einem logarithmischen Raster aufeinander folgen.
Will man ein Vibrato programmieren, so muss man praktisch für alle 3 bis 4 Halbtoene eine neue Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Hüllkurve definieren, in denen die Änderung der Der Sound Manager: PeriodenlängePeriodenlänge mit steigender Frequenz immer kleiner werden.
Ist zum Beispiel bei der Grund-Periodenlänge 568 (110 Hz = Operationen: BD5B / 349A / 349A: FLO SUBA'') ein Ausschlag von 8 Einheiten gerade wahrnehmbar (Abstand zum nächsten Halbton ist hier etwa 33, also das vierfache), so bewegt sich das selbe 'Vibrato' drei Periodenlängen der Noten aus 9 Oktaven: Oktave -4 Periodenlängen der Noten aus 9 Oktaven: Oktave -3 Periodenlängen der Noten aus 9 Oktaven: Oktave -2 Periodenlängen der Noten aus 9 Oktaven: Oktave -1 Periodenlängen der Noten aus 9 Oktaven: Oktave +0 Periodenlängen der Noten aus 9 Oktaven: Oktave +1 Periodenlängen der Noten aus 9 Oktaven: Oktave +2 Periodenlängen der Noten aus 9 Oktaven: Oktave +3 Periodenlängen der Noten aus 9 Oktaven: Oktave +4Oktaven höher bei 880 Hz = Operationen: BD5B / 349A / 349A: FLO SUBa' bereits über +/- zwei Halbtoene! Die Der Sound Manager: PeriodenlängePeriodenlänge dieses Operationen: BD5B / 349A / 349A: FLO SUBa's beträgt 71, der Abstand zum nächsten Halbton nur noch etwa 4 Einheiten! (Vergleiche die Tabelle im AnhangAnhang.)
Aehnlich wie bei der Amplitude kann man auch bei Tonperioden-Hüllkurven in einem Abschnitt die Tonperioden-Länge auf einen Adressierungsarten der Z80: Absolutabsoluten Wert neu festsetzen. Diese Möglichkeit ist im Basic-Handbuch weder erwähnt noch beschrieben, obwohl es auch hier möglich ist! Der Syntax ist dabei der Definition einer Hardware-Volumenhüllkurve ähnlich:
ENT 5, =568,10, ...
Auch hier enthält der Abschnitt nur noch zwei statt drei Basic und Maschinencode: ParameterParameter. Der erste gibt die neue Tonperiodenlänge an und der zweite bestimmt die Pausenlänge nach dieser Änderung. Da auch für jedes ENT-Treppchen zuerst die Änderung durchgeführt und erst danach gewartet wird, kann man, wenn man bereits im ersten Abschnitt eine Adressierungsarten der Z80: Absolutabsolute Periode programmiert, die Angabe im Sound-Statement vollkommen unterdrücken.
In Maschinensprache sieht der Syntax ein wenig anders aus. Hier ist die Adressierungsarten der Z80: Absolutabsolute Festlegung daran erkennbar, dass im ersten Datentypen: Bytes Datenbreite: BytesByte des Abschnitts (normalerweise Schrittzahl) die obersten 4 Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits gesetzt sind. Damit ergibt sich für dieses Datentypen: Bytes Datenbreite: BytesByte ein Wert, der größer oder gleich &Der Zeichensatz des Schneider CPC: &F0 = 240F0 = 240 ist. Alle Werte darunter (0 bis &EF = 239) zeigen, dass ein Adressierungsarten der Z80: Relativrelativer Abschnitt folgt. Alle Werte ab &Der Zeichensatz des Schneider CPC: &F0 = 240F0 zeigen, dass eine Adressierungsarten der Z80: Absolutabsolute Festlegung der Frequenz erfolgen soll.
Hierbei werden dann die ersten beiden Datentypen: Bytes Datenbreite: BytesBytes zu einem Datenbreite: WordsWord zusammengefasst, das die neue Der Sound Manager: PeriodenlängePeriodenlänge darstellt. Im ersten Datentypen: Bytes Datenbreite: BytesByte werden die vier obersten Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits ausmaskiert, und der Die ICs im Überblick: Der PSG AY-3-8912 Die Anschlussbelegungen der wichtigsten ICs im CPC: Der PSG AY-3-8912PSG mit dem so erhaltenen Wert programmiert. Da die Der Sound Manager: PeriodenlängePeriodenlänge beim Die ICs im Überblick: Der PSG AY-3-8912 Die Anschlussbelegungen der wichtigsten ICs im CPC: Der PSG AY-3-8912AY-3-8912 nur mit 12 Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit genau angegeben werden kann, sind die 4 obersten Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bits eh' bedeutungslos.
Das dritte Datentypen: Bytes Datenbreite: BytesByte stellt dann wieder, wie gewöhnlich, die Pausenlänge dar, die nach dieser Einstellung abgewartet werden muss.
Vor einer gemeinen Falle seien hier aber die Assembler-Programmierer gewarnt: Das erste Datentypen: Bytes Datenbreite: BytesByte der Der Sound Manager: PeriodenlängePeriodenlänge ist hier das höherwertige Datentypen: Bytes Datenbreite: BytesByte! Hier musste vom normalen Die CPU Z80: Byte-SexByte-Sex der Z80-CPU abgewichen werden. Die beiden folgenden Beispiel zeigen einen falschen und einen korrekten Abschnitt für BCAA: SOUND QUEUE: Der Parameterblock:den Parameterblock:
------------------------------------------------------------------------
falsch: DEFW &F000 + APL richtig: DEFB APL\256 OR &Der Zeichensatz des Schneider CPC: &F0 = 240F0 ; MSB von APL
DEFB PAUSE DEFB APL AND &FF ; LSB von APL
DEFB PAUSE
------------------------------------------------------------------------
Viele Assembler stellen für die benötigten Verknüpfungen spezielle Kommandos bereit. Leider gibt es hier keinen einheitlichen Standard. Für das Beispiel wurde deshalb der Syntax von Einleitung: BASIC Anhang: BasicBasic angenommen.
|