Synthesizer Selbstbau im Xilinx-FPGA mit MIDI-Ansteuerung

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:
  • 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
Eine Waveform kann verwendet werden als Audiosignal oder Modulator. Dazu gibt es verschiedene Konfigurationen (s.u.).

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)
Modulationen:
  • 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)
Filter:
  • 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)
Delay:
  • 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)
Mixer:
  • 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 :schwachz:

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:
Ey richtig cooles Projekt! Herzlichen Glueckwunsch, scheint ja soweit fertig zu sein? Ich meld mich die Tage mit mehr Fragen, aber wie stehst du zu der moeglichkeit das einfach durch einen zweiten FPGA hochzuskalieren? so dass du 8 stimmen a 2xOSC oder 6 stimmen a 3xOSC realisieren kannst?

Wenn du irgendwann den Drang verspuerst das ganze doch in eine fertige Kiste mit keyboard & reglern zu packen dann meld dich bei mir, kann dir eine FATAR tastatur zu selbstkosten abgeben, und ggf ein paar schicke RGB-encoder-boards

ach ja, photos, auch wenn es nur eine proto-platine ist, sind immer gerne gesehen, und noch mehr natuerlich klangbeispiele.
 
Super spannend


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.
Ich jätte da Konzepte für monophone Synths wo das egal ist.. zB das Trautonium Konzept von mir
könnte grade so laufen


Wie bedienst Du den denn dann, dh wie änderst Du Parameter usw?

was kostet das Board?

Wie schwer ist es in VHDL reinzukommen?

Mich würde das ziemlich interessieren
 
Vielen Dank für euer Interesse.

@weasel: An der Hardware ändere ich wohl nichts mehr. Ich hab noch ein anderes Xilinx-Board (ML403) ungenutzt rumzuliegen, jedoch hat das noch weniger Ressourcen. Der Synthesizer im FPGA und die zugehörige Software sind jedoch gefühlt nie fertig. Mir fällt immer noch was ein was man reinquetschen könnte. Der String-Synthesizer-Modus (angelehnt an ARP Solina String Ensemble) ist z.B. erst in den letzten zwei Wochen entstanden.

@Pete17: Klar gibts Fotos, und Videos auch. Da ist aber von einem Synthesizer an sich nicht viel zu erkennen. (s.u.)

@NoMoreWords: Anfangs, als ich das MIDI-Interface noch nicht fertig hatte, konnte ich das nur per IR-Fernbedienung oder Terminal (via serielle Schnittstelle) steuern. War mühsam. Mittlerweile wird alles komplett über MIDI mit dem Controller gesteuert (über CC-Botschaften, bei Bedarf auch RPN/NRPN). Das Board hatte ich damals vor der Verschrottung bei meinem Arbeitgeber gerettet und offiziell entinventarisiert. Keine Ahnung was das gekostet hat, gibts sowieso nicht mehr. Man könnte das Prinzip aber auf aktuelle FPGA-Boards übertragen. Man muß nur schauen daß man alle Interfaces auf dem Board draufhat die man benötigt (für meinen Verwendungszweck ist das Audio-Interface essentiell). VHDL ist eine "gewöhnliche" Programmiersprache zur Hardwarebeschreibung. Damit hab ich >25 Jahre beruflich zu tun. Ist aber nicht sooooo schwierig ;-)

Die Rückseite der Hardware mit dem Xilinx-Board sieht man hier (rechts das gefräste Adapter-Board für den Anschluß des RGB-Displays):

full


Die Front mit den LED-Panels:

full


Die Bilder stammen noch aus der Bauphase des Hardware-Projektes (vor ca. 15 Jahren). Da ging es nur um das LED-Matrix-Display, und an einen Synthesizer war noch gar nicht zu denken.

Später gabs noch eine Frontplatte dazu, das erkennt man in dem Video in meiner Galerie:

https://www.sequencer.de/synthesizer/media/wg3p0303-mp4.1259/

Zwischenzeitlich gabs einen Spektrum-Analyzer, der mir Musik farbenfroh auf dem Matrix-Display visualisieren kann. Ein Video dazu wollte ich hochladen, hat die Forum-Galerie aber wegen der Größe verweigert.

Das Ding sieht aktuell noch genauso aus, nur daß auf dem Display jetzt die Visualisierung des Synthesizers zu sehen ist und per MIDI-Kabel ein Controller dranhängt (Arturia Keylab MKII).

Ich hab ein Video von der Synthesizer-Visualisierung in meine Galerie geladen, allerdings kann es wohl nicht abgespielt werden:

https://www.sequencer.de/synthesizer/media/20211209_154231-mp4.1255/

(zu sehen wäre die Visualisierung zweier LFOs die sich gegenseitig frequenzmodulieren (Cross-FM))

Ich schau mal ob das per Youtube besser geht.

Grüße,
Dirk
 
mir faellt grad ein, ich hab hier noch ein zrna AN231E04 FPAA board rumliegen mit dem ich leider vermutlich zeitnah nichts anfangen werde, guck dir das doch mal an, bei interesse ueberlass ich dir das gerne! du scheinst ja was draus machen zu koennen... FPAA fand ich im gegensatz zu FPGA ja auch sehr spannend. vielleicht als variable analoge ausgangsstufe zu deinem synth oder so?

ps. video in deiner galerie laeuft!
 
Hi Dirk,

ich habe einen ähnlichen Hintergrund, aber ziemlich weit in der Vergangenheit. Vor ca. 35 Jahren die ersten FPGAs überhaupt, auch von Xilinx übrigens, in die Finger bekommen und von da an viel damit gebaut. Später nach etwas Pause einiges mit Altera und deren Haussprache (ähnlich VHDL) gemacht. Zwei fast "verschiedene Welten", sie gefielen mir beide. Die neueren tollen Entwicklungen wie Softcores kenne ich nur noch aus der Fachpresse. Heute habe ich kein Entwicklungssystem mehr. Für größere Bastelvorhaben würde mir auch etwas die Energie fehlen. Ab und zu finde ich es etwas schade, denn auch Kleinprojekte würden manchmal vom Rapid-Prototyping mit FPGAs (oder CPLDs) profitieren.

Wenn ich einen FPGA-Synthesizer bauen wollte, würde ich ihn wahrscheinlich vorher in Software modellieren, mindestens sein Blockschaltbild in einem feingranularen, "tiefen" Soft-Modularsystem. Bei FPGAs nehmen die großen Firmen Simulatoren her, da ich bin nicht so sicher, ob das das Debugging am Ende wirklich schneller macht. Ich habe lieber Selbstdiagnosefunktionen mit einer Handvoll Messausgängen mit eingebaut. Wie gehst du da heran?

Es gibt da noch ein paar Kollegen im Netz mit ähnlichen Projekten, kennst du wahrscheinlich, scheint ja alles ziemlich verwaist zu sein. Du bist anscheinend doch schon recht weit gekommen. Wann kommt das Update, das den Waldorf Iridium Kyra* schlägt? ;-)

Den Spaß daran kann ich dir jedenfalls gut nachfühlen!
Gruß von Jens

* Update: Sorry, ich hatte die beiden Waldörfer verwechselt, ich meinte das FPGA-Monster.
 
Zuletzt bearbeitet:
Ich hab hier seit einigen Monaten ein Arty-7 100T rumliegen und bin da doch echt ziemlich kulturschockiert. VHDL & Verilog sind für mich mit 08/15-Programmierkenntnissen doch eher drei Kübel eiskaltes Wasser, weil die Konzepte dahinter so fundamental anders sind.

Da bin ich für jedes Codefitzelchen aus einem funktionierenden Projekt grundsätzlich sehr sehr dankbar.
 
Wenn ich einen FPGA-Synthesizer bauen wollte, würde ich ihn wahrscheinlich vorher in Software modellieren, mindestens sein Blockschaltbild in einem feingranularen, "tiefen" Soft-Modularsystem. Bei FPGAs nehmen die großen Firmen Simulatoren her, da ich bin nicht so sicher, ob das das Debugging am Ende wirklich schneller macht. Ich habe lieber Selbstdiagnosefunktionen mit einer Handvoll Messausgängen mit eingebaut. Wie gehst du da heran?

Nunja, ich bin etwas anders rangegangen: ich hab die Tonerzeugung in Hardware nachgebaut (ich meine die funktionalen Baugruppen und den Signalweg, natürlich baue ich keinen analogen Oszillator nach ;-) ). Vom Prinzip her alles so wie man es von einem Hardware-Synth kennen würde. In Software würde man dies wohl anders entwerfen. Da kann man auch viel machen, da man für die Berechnung eines Samples quasi (fast) unendlich viel Prozessorzeit hat, weil die Prozessortaktfrequenz immer um ein Vielfaches höher ist als die Sample-Frequenz.
Im Endeffekt hab ich doch viel serialisiert: die Berechnung der Hüllkurven und auch die Modulationsberechnungen werden ressourcensparend nacheinander ausgeführt.
Immerhin hat man bei 100MHz Prozessortakt und 96kHz Samplerate schon ein paar Zyklen Zeit.

Simulation mache ich nicht (war beim "All-in-one"-Paket nicht dabei). Diagnose erfolgt mit der "Hauslösung" von Xilinx: im FPGA ist ein integrierter Logic-Analyzer eingebaut, der bei Bedarf mit unterschiedlichen Signalen verbunden wird, die beobachtet werden sollen. So kann man dem Ding mit dem ChipScope-Analyzer quasi in Echtzeit zuschauen.


Es gibt da noch ein paar Kollegen im Netz mit ähnlichen Projekten, kennst du wahrscheinlich, scheint ja alles ziemlich verwaist zu sein. Du bist anscheinend doch schon recht weit gekommen. Wann kommt das Update, das den Waldorf Iridium schlägt? ;-)

Nunja, ich bin da eher "klassisch" unterwegs. Durch die begrenzten Ressourcen hab ich da nicht viele Möglichkeiten um komplexe Berechnungen zu machen. Einen Sampler hab ich z.B. mal entworfen, der bietet mir sogar Bearbeitungsmöglichkeiten mit Hilfe der Visualisierung auf dem Matrix-Display (einzelne Samples anschauen, Anfang und Ende ausrichten, damit es beim Sample-Looping keine Sprünge gibt usw.). Hab sogar mal nachgedacht, eine Lichtgriffel-Steuerung einzubauen, um die Samples direkt auf der 64x16-LED-Matrix zu editieren, richtig Vintage-style.... :eek:
Jedoch kann ich durch die begrenzten Ressourcen nicht alles gleichzeitig implementieren. Ein Sampler wär aber möglich, wenn ich z.B. FM rausschmeiße.

Den Spaß daran kann ich dir jedenfalls gut nachfühlen!

Der Spaß ist das wichtigste daran :)




...wenn Du auch 4 Delay Lines in den Effekten hast, könntest Du gleich einen „Ensemble Effekt“ für den String Synth dazu packen.

Das ist drin, ja. Darum ging es ja hauptsächlich.
Das kostet echt viele Ressourcen: 8 Oscillatoren für die 8 Stimmen, dann vier Delay-Lines und je Delay-Line 2 LFOs. Dann die drei Filter im Notch-Modus, Filterfrequenz mit langsam-freilaufenden Envelopes (weil kein LFO/Oszillator mehr übrig war) moduliert. Aber es funktioniert super und klingt auch seeehr schön :)

Ich hab das in der Featureliste oben ergänzt.




Ich hab hier seit einigen Monaten ein Arty-7 100T rumliegen und bin da doch echt ziemlich kulturschockiert. VHDL & Verilog sind für mich mit 08/15-Programmierkenntnissen doch eher drei Kübel eiskaltes Wasser, weil die Konzepte dahinter so fundamental anders sind.

Ja, man muß sich nur ein paar Grundlagen klarmachen. Man kann nicht so einfach C-Code in VHDL-Code überführen. Aber im Prinzip ganz einfach ;-)

Da bin ich für jedes Codefitzelchen aus einem funktionierenden Projekt grundsätzlich sehr sehr dankbar.

Wovon willst du ein Codeschnipsel sehen? ;-)

Grüße,
Dirk
 
Zuletzt bearbeitet:
Hier ein paar Soundsamples. Ich hab mal ein bissle im String-Modus (Nr023) geklimpert. Die anderen Aufnahmen sind schon etwas älter. Wie schon geschrieben, erwartet bitte nicht zu viel, ich bin kein Musiker....
 

Anhänge

  • capture-samples-023-strings-20b.mp3
    541,1 KB
  • 009-test-arpeggiator-notedelay-v1.mp3
    267,3 KB
  • 013-test-flanger-double-v1.mp3
    310,5 KB
  • 016-test-filter-reverb.mp3
    424,9 KB
Zuletzt bearbeitet:
Hallo allerseits,
vielleicht kann mir jemand von euch Profis helfen:
Welches Verhalten bzw. welchen Stellbereich hat das Pitchbend-Rad an einem "üblichen" Synthesizer, bzw. was erwartet ein Spieler gemeinhin, wenn er am Pitch-Bender dreht?

Da ich selbst keinen Synthesizer als Vorlage zur Verfügung hab/hatte, musste ich diesbezüglich immer Annahmen treffen. Zur Zeit zieht der Pitchbender im "normalen Spielmodus" bei meinem Synthesizer den gespielten Ton (alle beteiligten Oszillatoren) um bis zu ca. zwei Semitones nach oben oder unten. Ausnahmen gibts z.B.
- bei aktivierter Ringmodulation: hier wird nur ein Oszillator gepitcht, um Schwebungen zu erzeugen
- in einigen FM-Modi pitche ich auch die Modulatoren
- es gibt einen Chorus-Modus, bei dem ich den LFO, der die Delayzeit moduliert, auf der Frequenz 0 steht und mit dem Pitchbender manuell vor- oder rückwärts laufen lassen kann

Jedoch, abseits von den Ausnahmen...

Ich habe ein Youtube-Video gesehen, da hat jemand den Pitch-Stick exzessiv genutzt und dieser hat einen großen Bereich abgedeckt, ich denke es war +- eine Oktave.

Jetzt stelle ich mir die Frage: Wie sollte es sein? ;-)

Grüße,
Dirk
 
Oha, ich hab es zwar skalierbar im FPGA implementiert, jedoch (noch) nicht über solch einen großen Bereich und auch nicht nach oben/unten unterschiedlich :eek:

Danke für die Info.

Grüße,
Dirk
 
Danke für die Info.
Ist quasi die Luxusvariante. Bei vielen Synths ist es symmetrisch und einstellbar in Halbtönen bis zu einer Oktave. Hängt ja auch von der Engine ab, was die so kann. Nicht immer will man die Artefakte bei einem Bend über vier oder acht Oktaven dann auch hören. Interessant ist noch, dass nicht alle Synths die vollen 14-Bit Auflösung unterstützen (eher sende-seitig).

Siehe auch hier:
 
Da hab ich Glück, aber nur n bissle: Der Arturia sendet zwar die vollen 14 Bits über MIDI (0x60), scheint jedoch das LSByte zu dithern: es kommen jedesmal leicht andere Werte wenn ich langsam drehe: eine "Stufe" nach oben und zurück erzeugt die Wertefolge 0, 90, 192, 90, 0. Beim zweiten mal dann 0, 10, 111, 208, 101, 0. Vielleicht unterstützt der Sensor vom Rad selbst nicht die Auflösung. Scheint auch abhängig zu sein von der Drehgeschwindigkeit.
Bisher, ohne den großen Pitch-Bereich, höre ich keine Artefakte.

Grüße,
Dirk
 
Wie schon geschrieben, erwartet bitte nicht zu viel, ich bin kein Musiker....

es ist schon irgendwie in bischen schade, dass jemand, der in der lage dazu ist einen FPGA zu programmieren, dann aber so wenig erfahrung mit DSP hat, dass er einen synth mit grundwellenformen und billigfiltern baut.

ich kenne sehr viele leute, bei denen ist es exakt umgekehrt - denn die meisten "musiker" wissen nicht mal was ein FPGA ist, geschweige denn dass sie irgendwas mit assembly zu tun hätten, sondern benutzen die einschlägigen "musiker" programmierumgebungen oder C++.

meine "hardware synths" bestehen alle aus mini-rechnern mit IOs von der stange und ich mach nur die software^^
 
Um auf die Frage des PB Ranges zurüclzukommen:
ein größerer Range als +- 2 Halbtöne ist eigentlich nur interessant wenn man eine ribbonkontroller nutzen will oder ein ähnliches
Interface auf dem man mehrere Oktavem kontinuiertlich ansprechen will. Deswegen hat MIDI dafür auch die feine Auflösung.

"Normal" ist aber schon ein 2 Halbton-Range.
 
es ist schon irgendwie in bischen schade, dass jemand, der in der lage dazu ist einen FPGA zu programmieren, dann aber so wenig erfahrung mit DSP hat, dass er einen synth mit grundwellenformen und billigfiltern baut.

Wer hat behauptet ich hätte wenig Erfahrung mit DSPs? ;-)

BTW Das von mir benutzte FPGA hat 192 "DSP48"-Makroblöcke, von denen ich fast die Hälfte benutze.
 
Um auf die Frage des PB Ranges zurüclzukommen:
ein größerer Range als +- 2 Halbtöne ist eigentlich nur interessant wenn man eine ribbonkontroller nutzen will oder ein ähnliches
Interface auf dem man mehrere Oktavem kontinuiertlich ansprechen will. Deswegen hat MIDI dafür auch die feine Auflösung.

"Normal" ist aber schon ein 2 Halbton-Range.

Ich hab grad mal ne Testversion mit dem Vierfachen des ursprünglichen Wertebereichs gebaut (jetzt maximal ca. 7 Semitones nach oben, 12 nach unten) und man bemerkt beim genauen Hinhören schon Sprünge beim Pitchen.
 
Der Arturia sendet zwar die vollen 14 Bits über MIDI (0x60), scheint jedoch das LSByte zu dithern: es kommen jedesmal leicht andere Werte wenn ich langsam drehe: eine "Stufe" nach oben und zurück erzeugt die Wertefolge 0, 90, 192, 90, 0. Beim zweiten mal dann 0, 10, 111, 208, 101, 0.


Interpretiert deine Midi-VHDL-Implementierung denn nach dem Statusbyte für Pitchbends denn überhaupt zwei 7-Bit-Folgen, wobei da zuerst LSB und erst danach das MSB kommt oder eben ganz klassisch nur eine? Bei dir scheinen die Werte ja nur bis 0xFF (=255) rauf zu reichen, was einfach nicht mal ansatzweise 14 Bit entspricht (=16383).

Ist bei deinem VHDL vielleicht die Reihenfolge von MSB und LSB in der Message falsch herum ausgewertet worden?

Der Aufbau bei 14-Bit-Pitchbend ist ja so komisch, damit auch alte Midi-Devices, die nur 7-Bit verstehen können, mit 14-Bit klar kommen können, indem sie eben, wie du beinahe richtig annimmst, das MSB (und nicht das LSB, wie von dir angenommen) abschneiden. Sie dazu auch den Screenshot:


1639588728005.png


Quelle: http://www.music-software-development.com/midi-tutorial.html
 
Zuletzt bearbeitet:
Interpretiert deine Midi-VHDL-Implementierung denn nach dem Statusbyte für Pitchbends denn überhaupt zwei 7-Bit-Folgen, wobei da zuerst LSB und erst danach das MSB kommt oder eben ganz klassisch nur eine? Bei dir scheinen die Werte ja nur bis 0xFF (=255) rauf zu reichen, was einfach nicht mal ansatzweise 14 Bit entspricht (=16383).

Äh, nein. Ich zitiere mich selbst:
es kommen jedesmal leicht andere Werte wenn ich langsam drehe: eine "Stufe" nach oben und zurück erzeugt die Wertefolge 0, 90, 192, 90, 0. Beim zweiten mal dann 0, 10, 111, 208, 101, 0.

Ich drehe ganz langsam um genau eine Stufe (also der Arturia zeigt auf dem Display den Sprung von Mittelstellung 64 auf 65). Natürlich interpretiere ich aus den per MIDI empfangenen 2x 7Bits den vollen Wertebereich -8192 bis +8191.

wie du beinahe richtig annimmst, das MSB (und nicht das LSB, wie von dir angenommen) abschneiden.

Nein, das nehme ich nicht an.
 
Ah sorry, das war Quark. Ich hab's bereits oben durchgestrichen. Aber auch hier nochmal der Gedanke: Hast du vielleicht MSB und LSB in der Message vertauscht?
 
Der Aufbau bei 14-Bit-Pitchbend ist ja so komisch, damit auch alte Midi-Devices, die nur 7-Bit verstehen können, mit 14-Bit klar kommen können...
Pitch Bend ist schon immer 14-Bit gewesen.
Ich hab grad mal ne Testversion mit dem Vierfachen des ursprünglichen Wertebereichs gebaut (jetzt maximal ca. 7 Semitones nach oben, 12 nach unten) und man bemerkt beim genauen Hinhören schon Sprünge beim Pitchen.
Ein wenig glätten?

Ansonsten, der Waldorf M hat einen Parameter B.RANGE (Bend Range), der im Handbuch so erklärt wird:
Determines the intensity of the pitchbend (from 0 to 12 semitones) via MIDI Pitchbend messages in semitones for the corresponding oscillator.

Ein User hat dann nach +/-48 Halbtönen gefragt:
 

Ah sorry, das war Quark. Ich hab's bereits oben durchgestrichen. Aber auch hier nochmal der Gedanke: Hast du vielleicht MSB und LSB in der Message vertauscht?

Nein. Wenn ich den ganzen Bereich des Pitchbenders am MIDI-Controller durchdrehe, sehe ich auch korrekt bei mir den gesamten Wertebereich von -8192 bis +8191 ankommen, eben mit seltsamen Quantisierungen. Wie man oben sieht, ist der erste von Null verschiedene Wert am Anfang z.B. einmal 10, ein anderes Mal 16, und auch mal 90. Ebenso sind auch die Sprünge zwischen den Werten unterschiedlich. Daher ja meine Vermutung, daß entweder gedithert wird oder es von der Drehgeschwindigkeit abhängt.
BTW Zeigt die MIDI-Konsole auch Wertesprünge an. Ich check das grad.

Nachtrag: Die Arturia MIDI-Konsole (Teil des Verwaltungsprogramms "MIDI Control Center" auf dem PC, verbunden per USB) zeigt dieselben Werte (auch -sprünge) an, die ich in meinem FPGA empfange.
 
Zuletzt bearbeitet:


News

Zurück
Oben