DiSc
|
Hallo Leute,
ich bin neu hier (Dirk, 51J., Elektronik- und Software-Bastler) und habe in der letzten Zeit einen meiner Jugendträume verwirklicht: einen Synthesizer selbst bauen.
Besteht hier die Möglichkeit bzw. der Bedarf zum Erfahrungsaustausch?
Ein paar technische Details zum Projekt:
Basis ist ein FPGA-Evaluation-Board von XILINX ("ML402") und entwickelt wird der FPGA-Teil in VHDL (Hardwarebschreibungssprache) und der Software-Teil in C. Die gesamte Tonerzeugung inkl. Oszillatoren, Modulation, Hüllkurvensteuerung, Polyphonie-Steuerung, Filter, Delay, Mixer, Signal-Routing erfolgen quasi in Hardware (im FPGA). Das Audio-Interface ist ein "AC97"-Soundchip auf dem Evaluation-Board. Das Hardwareinterface für den MIDI-Empfänger hab ich selbst drangebastelt. Der MIDI-Decoder wiederum ist in VHDL realisiert.
Der Prozessor, auf dem die Software läuft, ist ein sog. Microblaze-"Softcore"-Prozessor in FPGA-Logik mit 100 MHz Systemtaktfrequenz und 128kiB Programm- und Arbeitsspeicher).
Sowohl VHDL-Code als auch C-Code sind skalierbar, d.h. bei Migration auf eine Umgebung mit mehr Ressorcen ist eine leichte Erweiterung (auf mehr Polyphonie z.B.) möglich.
Am FPGA-Eval-Board ist auch noch eine RGB-LED-Matrixansteuerung angebaut. Das ist Ergebnis eines früheren Projektes, wird aber hier für die Audio-Visualisierung mitbenutzt.
Angesteuert wird das ganze Ding durch ein MIDI-Controller-Keyboard (Arturia KeyLab MKII)..... den Selbstbau einer Tastatur habe ich mir immer noch nicht zugetraut, das war auch der Blocker der mich in meiner Jugend daran gehindert hat, das Projekt zu bauen.
Audio-Daten:
intern:
Samplerate: 96000 Hz
Bitbreite: >=20 Bits (Ausnahmen: die Filter arbeiten mit 24 Bits)
extern (PCM Ein- und Ausgabe, begrenzt durch die Möglichkeiten des AC97-Audiointerface):
2 Kanäle (Stereo)
Samplerate: 48000 Hz
Bitbreite: 18 Bits
Die zur Verfügung stehende Plattform ist sehr alt (ca. 15 Jahre) und gibt etliche Grenzen vor, daher sind z.B. die umsetzbaren Features begrenzt durch die vorgegebene Logik-Komplexität des FPGAs auf dem ML402-Board. Ebenso wird der Umfang der Software auch begrenzt durch die Features des Microblaze-Prozessors und den zur Verfügung stehenden Arbeitsspeicher (128kiB).
Synthesizer-Features:
Waveform-Erzeugung:
Hüllkurven:
Beispiel-Konfigurationen:
Die Software ist zuständig für
(wird bei Bedarf präzisiert und auch erweitert, falls ich noch was neues einbaue)
Wie oben erwähnt, gibt es Einschränkungen durch die zur Verfügung stehenden Ressourcen. Zum Beispiel schaffe ich es nicht, mehr als 3 Filter reinzubekommen. Ein polyphoner Subtraktiv-Modus ist also z.Z. nur bis maximal 3 Stimmen möglich.
So, das wars für Erste. Falls es von euch noch Anregungen oder Fragen gibt, schreibt einen Beitrag
BTW: Ich bin Bastler, kein Musiker. Isch kann das Teil also gar nicht sinnvoll spielen
Grüße,
Dirk
Ein paar Credits:
Anregungen für SVF-Filter und Noise-Generator hab ich bei fpga.synth.net (Autoren: Scott R. Gravenhorst, Eric Brombaugh) gefunden und für meine Bedürfnisse adaptiert.
VHDL-Beispielcode für einen MIDI-Decoder hab ich auf Github gefunden.
ich bin neu hier (Dirk, 51J., Elektronik- und Software-Bastler) und habe in der letzten Zeit einen meiner Jugendträume verwirklicht: einen Synthesizer selbst bauen.
Besteht hier die Möglichkeit bzw. der Bedarf zum Erfahrungsaustausch?
Ein paar technische Details zum Projekt:
Basis ist ein FPGA-Evaluation-Board von XILINX ("ML402") und entwickelt wird der FPGA-Teil in VHDL (Hardwarebschreibungssprache) und der Software-Teil in C. Die gesamte Tonerzeugung inkl. Oszillatoren, Modulation, Hüllkurvensteuerung, Polyphonie-Steuerung, Filter, Delay, Mixer, Signal-Routing erfolgen quasi in Hardware (im FPGA). Das Audio-Interface ist ein "AC97"-Soundchip auf dem Evaluation-Board. Das Hardwareinterface für den MIDI-Empfänger hab ich selbst drangebastelt. Der MIDI-Decoder wiederum ist in VHDL realisiert.
Der Prozessor, auf dem die Software läuft, ist ein sog. Microblaze-"Softcore"-Prozessor in FPGA-Logik mit 100 MHz Systemtaktfrequenz und 128kiB Programm- und Arbeitsspeicher).
Sowohl VHDL-Code als auch C-Code sind skalierbar, d.h. bei Migration auf eine Umgebung mit mehr Ressorcen ist eine leichte Erweiterung (auf mehr Polyphonie z.B.) möglich.
Am FPGA-Eval-Board ist auch noch eine RGB-LED-Matrixansteuerung angebaut. Das ist Ergebnis eines früheren Projektes, wird aber hier für die Audio-Visualisierung mitbenutzt.
Angesteuert wird das ganze Ding durch ein MIDI-Controller-Keyboard (Arturia KeyLab MKII)..... den Selbstbau einer Tastatur habe ich mir immer noch nicht zugetraut, das war auch der Blocker der mich in meiner Jugend daran gehindert hat, das Projekt zu bauen.
Audio-Daten:
intern:
Samplerate: 96000 Hz
Bitbreite: >=20 Bits (Ausnahmen: die Filter arbeiten mit 24 Bits)
extern (PCM Ein- und Ausgabe, begrenzt durch die Möglichkeiten des AC97-Audiointerface):
2 Kanäle (Stereo)
Samplerate: 48000 Hz
Bitbreite: 18 Bits
Die zur Verfügung stehende Plattform ist sehr alt (ca. 15 Jahre) und gibt etliche Grenzen vor, daher sind z.B. die umsetzbaren Features begrenzt durch die vorgegebene Logik-Komplexität des FPGAs auf dem ML402-Board. Ebenso wird der Umfang der Software auch begrenzt durch die Features des Microblaze-Prozessors und den zur Verfügung stehenden Arbeitsspeicher (128kiB).
Synthesizer-Features:
Waveform-Erzeugung:
- 16 Oszillatoren (DDS) mit einer Samplerate von 96000 Hz und Frequenzauflösung von ca. 2,2 * 10^-5 Hz (0,000022 Hz)
- Transpose-, Tune- und Pitch-Möglichkeiten nach oben und unten (Transpose bis zu 8 Oktaven)
- Portamento mit einstellbarer Rate (proportional zum Notenabstand oder linear)
- variabler (digitaler) Frequenzteiler für diverse geraden oder krummen Teilerverhältnisse: z.B. 1/3 angenähert über f × 341 / 1024 (Fehler ist <0,1%) bis f × 1023 / 1024
- Wellenformen: Sinus, Dreieck, Trapez, Sägezahn, Rechteck/Pulse, Rauschen (einstellbare Rauschbandbreite: "weiß"/"rosa")
- Waveforming über "Wavefolding", Saturierung, "Distortion" (kontrollierte Übersteuerung)
- Sample&Hold mit Signalquellen LFO, Sinus, Rauschen und einstellbarer Slew-Rate-Begrenzung und optionalem Return-to-zero
- Oszillator-Synchronisierung ("Hardsync", "Softsync" via "Phase-Advance-Sync")
- externe Signalquelle über PCM-Eingang
Hüllkurven:
- 12 unabhängige Hüllkurven mit 8 Phasen (Idle, Wait, Attack, Bounce, Decay, Sustain, Cancel, Release)
- "Idle" ist hier die Ruhephase der Hüllkurve (benötigt für "Freerun"-Modus)
- bei jeder Phase kann Zeit (1ms bis 65s) und Level (absolut oder relativ) eingestellt werden
- Hüllkurvenverlauf eher im "Attack"-Stil (anfangs sehr schnell, gegen Ende eher logarithmisch) oder annähernd linear
- Level-Wertekennlinie kann zusätzlich quadratisch modifiziert werden (dies ist besser geeignet für die Filterfrequenzsteuerung)
- zeitlicher Verlauf und Level können anhängig von Keyboard-Velocity, Aftertouch, Pedalwerte (Sustain, Sostenuto, Soft, Legato, Expression) dynamisch modifiziert werden
- Trigger über Keyboard ("Note On"), einmalig, legato, wiederholend oder freilaufend
- freilaufende Hüllkurven können synchronisiert werden
- eine Hüllkurve steuert z.B. Audiosignalstärke ("VCA"), Waveforming-Stärke, Modulationsstärke, Filter-Cutoff-Frequenz ("VCF"), Delay-Zeit (für Reverb, Chorus, Flanger)
- diverse Routing-Möglichkeiten für Modulationsquelle und -ziel z.B. LFO <-> LFO, LFO -> Oscillator, Oscillator <-> Oscillator, LFO -> Filter, LFO -> Delay
- auch Selbst- und Cross-Modulation
- Frequenzmodulation "Vibrato": linear, logarithmisch, via Phasenmodulation ("Yamaha-Stil")
- Phasenmodulation
- Pulsweitenmodulation (nur für Rechteck/Pulse)
- Amplitudenmodulation ("Tremolo")
- Ringmodulation
- Filterfrequenz-Modulation
- Delay-Zeit-Modulation
- Modulationsstärke steuerbar über Hüllkurve (hierüber auch per Velocity, Aftertouch, Pedale)
- 3x State-Variable-Filter (12dB/Oktave) als Lowpass, Highpass, Bandpass, Notch-Filter
- Filter-Frequenz ist dynamisch steuer- und modulierbar über "Key-follow", LFO, Envelope, Aftertouch
- "Glide"-Funktion mit einstellbarer Glide-Rate für Filter-Frequenz
- Filter-Resonanz ist dynamisch steuerbar über Aftertouch
- generell jedoch schwer beherrschbar (statt "Eigenresonanz" gibts eher "unbeschreibliches Chaos"), wohl eine Eigenheit digitaler SVF-Designs
- variables Signal-Routing (seriell oder parallel)
- 4x unabhängige Delay-Line jeweils bis zu ca. 150ms Delay-Zeit
- modulierbare Delay-Zeit
- Feedback-Pfad mit einstellbarem Feedback-Anteil
- verschiedene Delay-Modi (Dry/Wet-Mix additiv/subtraktiv, ego/cross-channel), Pingpong-Delay, "dotted 8th note delay"
- verschiedene Reverb-Modi
- Chorus- und Flanger-Modus
- Modulation der Delay-Zeit mit vier asynchron laufenden LFOs
- manuelle Pitch-Steuerung für die Modulation der Delay-Zeit bis zur Frequenz 0 (Effekt einfrieren) und negative Frequenzen (Effekt "läuft rückwärts")
- variables Signal-Routing (seriell oder parallel, Feedback-Kreuzverbindungen)
- flexible Mixer-Quellen (alle Oscillatoren, verschiedene Signalwege via Filter seriell/parallel und/oder Delay seriell/parallel, externe Signalquellen)
- Verteilung auf die zwei Stereo-Kanäle mit Pan-Möglichkeit
Beispiel-Konfigurationen:
- Polyphon-Modus "UNI": 3 Stimmen mit jeweils 2 Oscillatoren, 1 Filter, 3 Envelopes
- die beiden Oszillatoren laufen entweder im Audio-Mix oder einer als Modulator und der zweite als Carrier
- Polyphon-Modus "Strings": 8 Stimmen mit je 1x Oscillator und 1x Envelope
- vier parallele Delay-Lines moduliert durch acht LFOs für Mehrkanal-Triple-Chorus-Effekt
- Notch-Filter mit modulierter Filter-Frequenz für Phaser-Effekt
- Unison-Modus: 8 oder 12 Oscillatoren gleichzeitig, verstimmbar
- Shepard-Modus mit 8 Oszillatoren
- Parallel-Modus: 8 Oscillatoren in verschiedenen Fußlagen für Orgel-Klänge (hamonische Abstufung) oder auch subharmonisch
- Polyphone FM-"Operator"-Modi "Yamaha-style" M1 bis M6: 3 Stimmen mit jeweils 4 Oscillatoren in diversen Verschaltungen als Modulator bzw. Carrier, jeweils mit eigener Hüllkurve (paraphon, da alles gemeinsam durch die Filter geht)
Die Software ist zuständig für
- einfacher Step-Sequencer mit Zeitquantisierung und Arpeggiator
- Metronom-Timersteuerung
- die Konfiguration des Synthesizers über die empfangenen MIDI-Controller-Botschaften ("CC") oder eine Infrarot-Fernbedienung
- Oversampling, Anti-Aliasing-Filterung und Sample-Transport von und zum Audio-Interface
- Clipping-Detection
- Steuerung der Visualisierung über eine 64x16 RGB-LED-Matrix
- Laden und Speichern von Patches
- Audio-Recording mit Speicherung im DRAM
(wird bei Bedarf präzisiert und auch erweitert, falls ich noch was neues einbaue)
Wie oben erwähnt, gibt es Einschränkungen durch die zur Verfügung stehenden Ressourcen. Zum Beispiel schaffe ich es nicht, mehr als 3 Filter reinzubekommen. Ein polyphoner Subtraktiv-Modus ist also z.Z. nur bis maximal 3 Stimmen möglich.
So, das wars für Erste. Falls es von euch noch Anregungen oder Fragen gibt, schreibt einen Beitrag

BTW: Ich bin Bastler, kein Musiker. Isch kann das Teil also gar nicht sinnvoll spielen

Grüße,
Dirk
Ein paar Credits:
Anregungen für SVF-Filter und Noise-Generator hab ich bei fpga.synth.net (Autoren: Scott R. Gravenhorst, Eric Brombaugh) gefunden und für meine Bedürfnisse adaptiert.
VHDL-Beispielcode für einen MIDI-Decoder hab ich auf Github gefunden.
Zuletzt bearbeitet: