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!