HES Praktikum, Aufgabe 8
Huellkurven
Aufgabe 8a: Lautstaerke
Aufgabenstellung
Die Lautstaerke jeder Stimme soll einstellbar sein.
Anforderungen
Fuer jede Stimme v des Synthesizers kann in den Bits 7..0
des Registers (v*16 + 3) die Lautstaerke dieser Stimme
eingestellt werden. Der Wert im Register wird als
Abschwaechung des Signals in Einheiten von 0.375 dB
interpretiert (also sind Signalpegel von 0 dB bis
etwa -96 dB moeglich).
Hinweise
Druecken Sie die Abschwaechung von 0.375*n dB als (negative)
Zweierpotenz aus, mit der man das Signal multiplizieren muss!
Dabei duerfen Sie im Interesse "glatter" Zahlen ein wenig runden
(in der Groessenordnung von ein paar Promille im Exponenten).
Dann zerlegen Sie den Exponenten in einen ganzzahligen und
einen gebrochenen Anteil. Der ganzzahlige Teil kann durch
Schieben und der gebrochene Teil durch Multiplikation mit
einem Wert aus einer Tabelle realisiert werden. Da fuer den
naechsten Aufgabenteil eine gleichartige Tabelle mit hoeherer
Aufloesung benoetigt wird, bietet es sich an, die Tabelle
schon jetzt in einem Block-Memory abzulegen.
Aufgabe 8b: Release-Huellkurve
Aufgabenstellung
Sobald eine Stimme eingeschaltet wird, erklingt sie mit der
Lautstaerke, die im Register 3 der Stimme (wie oben geschildert)
eingestellt ist. Sobald die Stimme abgeschaltet wird, wird
sie mit einer einstellbaren Rate leiser ("klingt ab"). Ein
Wiedereinschalten ist zu jedem Zeitpunkt moeglich.
Anforderungen
Beim Einschalten (Bit 0 des Registers (v*16 + 0) auf 1) beginnt die
Stimme v mit der im Register (v*16 + 3) eingestellten Lautstaerke
zu klingen. Die Lautstaerke wird solange gehalten, wie die Stimme
eingeschaltet ist. Nach dem Ausschalten der Stimme (Bit 0 des
Registers (v*16 + 0) auf 0) klingt sie mit einer konstanten Rate
ab, bis die maximale Daempfung von ca. -96 dB erreicht ist. Danach
wird keine Schwingung mehr fuer diese Stimme erzeugt. Wird die
Stimme zu irgendeinem Zeitpunkt wieder eingeschaltet, beginnt der
Ablauf von neuem. Das gilt auch fuer ein Wiedereinschalten waehrend
des Abklingens.
Die Abklingrate der Stimme v kann in den Bits 7..0 des Registers
(v*16 + 5) eingestellt werden. Wenn H das hoeherwertige Nibble
dieses Registers und L das niederwertige Nibble ist (der Wert im
Register also (16*H + L) betraegt), dann wird damit die Abklingrate
(2^H) * (16 + L) * 0.0698 dB/sec eingestellt.
Hinweise
Zeichnen Sie zunaechst ein Zustandsdiagramm fuer eine einzelne
Stimme. Wieviele Zustaende brauchen Sie? Was sind die genauen
Bedingungen fuer die Zustandsuebergaenge?
Die oben beschriebene Interpretation des Registerwertes fuer die
Abklingrate ermoeglicht eine exponentielle Abhaengigkeit der Rate
vom Wert. Damit erhaelt man groebere Stufen bei grossen Werten,
aber eine feinere Abstufung bei kleinen Werten. Um eine Tabelle
fuer den exponentiellen Anstieg zu vermeiden, wird ein Produkt aus
einer Exponentialfunktion (2^H) und einer linearen Funktion (16 + L)
verwendet, die die Punkte der reinen Exponentialfunktion interpoliert.
Zeigen Sie, dass die Gesamtfunktion an den "Uebergangsstellen" von
(H, L=16) auf (H+1, L=0) keine Spruenge hat, die Interpolation also
funktioniert! Zeichnen Sie den Verlauf der Funktionen! Wie kann das
Produkt der beiden Funktionen einfach realisiert werden?
Die Konstante 0.0698 dB/sec ergibt sich aus einem Zaehler von 26 Bit,
der zu jedem Abtastzeitpunkt um den Betrag (2^H) * (16 + L) veraendert
wird, und dem zu durchfahrenden Pegelbereich von 96 dB. Wie genau
kommt der Zahlenwert zustande?
Erstellen Sie zur einfachen Benutzung eine Tabelle mit einem
Eintrag fuer jeden Wert des Ratenregisters (0x00..0xFF), die
die Gesamt-Abklingzeit von 0 dB bis -96 dB angibt! Welche Zeit
ergibt sich beim Wert 0x80? Welchen Wert muss man fuer eine
Abklingzeit von 1 sec waehlen?
Beachten Sie, dass die Pegelberechnungen additiv *vor* der Umsetzung
in einen Amplitudenfaktor durchgefuehrt werden koennen. Dieser muss
allerdings strikt im Bereich 0..1 bleiben, was man durch sogenannte
"Saettigungsarithmetik" erreichen kann. Dabei koennen Berechnungen
eine obere bzw. untere Schranke nicht ueber- bzw. unterschreiten,
sondern bleiben beim oberen bzw. unteren Grenzwert "haengen". Am
besten schreiben Sie eine kleine Verilog-Simulation fuer die Addition
mit 3-Bit-Saettigungsarithmetik, um sich die Sache zu verdeutlichen.
Tipp: Bei vorzeichenlosen Zahlen gibt sich ein Ueberlauf durch ein
Carry aus der hoechsten Stelle zu erkennen. Und wo Sie schon dabei
sind, koennen Sie auch gleich hier die Subtraktion untersuchen, die
in der naechsten Teilaufgabe benoetigt wird.
Aufgabe 8c: ADSR-Huellkurve
Aufgabenstellung
Nun soll fuer jede Stimme eine volle ADSR-Huellkurve moeglich sein.
"ADSR" steht fuer "Attack", "Decay", "Sustain" und "Release". Dabei
sind A, D und R Aenderungsraten (bzw. Zeiten), S ist ein Pegel.
Anforderungen
Nach wie vor soll im Register 3 die Gesamtlautstaerke der Stimme
angegeben werden. Wird die Stimme eingeschaltet, so steigt die
Lautstaerke von -96 dB auf 0 dB mit einer Rate, die in den Bits
15..8 des Registers 4 steht. Danach faellt die Lautstaerke auf
den Sustain-Level, und zwar mit einer Rate, die mit den Bits
7..0 des Registers 4 spezifiziert wird. Der Sustain-Level steht
in den Bits 15..8 des Registers 5, als Daempfung in Einheiten
von 0.375 dB. Mit diesem Pegel erklingt die Stimme, bis sie
ausgeschaltet wird. Dann klingt sie mit der Release-Rate (Bits
7..0 des Registers 5) aus, genauso wie im vorigen Aufgabenteil
beschrieben. Auch die Berechnung der Raten aus den Registerwerten
geschieht genauso wie dort beschrieben.
Hinweise
Auch hier empfiehlt es sich, ein Zustandsdiagramm fuer eine
Stimme zu zeichnen. Wie viele Zustaende werden benoetigt? Was
sind die genauen Bedingungen fuer die Zustandsuebergaenge?
Denken Sie daran, dass die "Key On"-Bedingung (Bit 0 im
Register 0) zu jedem Zeitpunkt wechseln kann!
ACHTUNG, WICHTIG!
Sie MUESSEN sich IMMER erst ENTLADEN, bevor Sie irgendeinen
Teil des FPGA-Bords beruehren! Nichtbeachtung kann zur Zerstoerung
der Bauteile durch statische Aufladung fuehren!