Microcontrollerprogrammierung für Synthesizer

Dieses Thema im Forum "Lötkunst" wurde erstellt von Dr. Unwissend, 14. November 2007.

  1. Moin,

    Ich will einen Microcontroller (Pic) benutzen, um die Steuerfunktionen innerhalb eines Synthesizers zu steuer.
    Schaltung der analogen Komponenten ist soweit klar, auch die hardwaremäßige Steuerung mittels DAC und Multiplexer, was mir aber noch nicht so klar ist, ist die Softwaresteuerung. Pic-Programmierkenntnisse sind vorhanden.

    Wie läuft das ganze denn so grundsätzlich ab? Der Pic soll die Bedienelemente abfragen, die Hüllkurven berechnen, Modulationen (LFO) usw.
    Wie berechnet man das alles so? Schreibt man bei jeder Controlleränderung eine neue Tabelle? Läuft ein Timerinterrupt?

    Wie man sieht, fehlt mir noch der konzeptionelle Zugang zum Ganzen. Wie machen das denn die anderen so? Ich will ja das Rad nicht neu erfinden.
     
  2. -FX-

    -FX- Tach

    Verstehe nicht ganz wo genau jetzt dasProblem liegt ? Geht es jetzt um die Kuvenverläufe ?
    Halt mal schauen wie die Hüllkurve real arbeitet und versuchen, das mathematisch (per mehreren einfachen, vielleicht sogar nur linearen, zeitlich aufeinanderfolgenden Funktionen) nachzubilden.
     
  3. ChromaMan

    ChromaMan Tach

    Hallo Dr. Unwissend
    das Rad neu erfinden brauchst Du nicht. Schaue mal in den Quelltext vom AVR-Synt rein (http://www.jarek-synth.strona.pl/AVRSYN.asm) der macht alles mit einem ATMEL AVR 90S8535 Controller.

    Zitat:
    AVRSYN is a monophonic "virtual analog" synth based on an Atmel AT90S8535 microcontroller. My aim was to check if a simple micro can be used for sound synthesis purposes. And the result? The 8535 managed to do all the tasks: front panel switches and pots services, receiving and processing MIDI messages, and sound generating! The synthesis architecture is simple: two DCO's, a DCF, and a DCA. There is also an LFO and an AR/ASR envelope generator.

    http://www.jarek-synth.strona.pl/

    Und gut dokumentiert hat er es auch. Evt. Hilft es Dir ja.

    Viel Spass beim Coden
    :roll:
     
  4. Anonymous

    Anonymous Guest

    Der Matrix 1000 hat einen 8 Bit Controller der ca. 2.Generation (6809), der mit 2MHz läuft (und damit 2 MNOPS schafft (Millionen Nops pro Sekunde)).
    Damit bekommt er Midi und die Steuersachen für 6 Stimmen hin.

    Die Engine läuft mit einer Rate von ca. 120 Hz. Das heißt, man braucht ausreichend Tiefpaßfilter, damit die Enginerate nicht ins Audiosignal durchschlägt. Da die Hüllkurven damit teilweise zu langsam werden kann der Controller die Ausgangssignale auch am Filter vorbei 'schnell' setzen.

    Die Midi-Daten werden (Zeichen da -> Interupt) in einen Puffer geschrieben.

    Abgearbeitet wird das ganz im Engine-Takt, dem 120Hz Interupt.

    Aus den Modulationsmatrix- und Soundeinstellungen wird eine Listen-struktur erzeugt, die dann für den tatsächlichen Sound die Ablaufsteuerung (die eigentliche Engine) bilden. Das ganze ist kurz vor selbstmodifiziertem Code bzw. Software-erzeugtem Code.
    Je nach Parametereinstellengen werden Modulationstabellen erzeugt. (Die Kennlinien sind nichtlinear, ausserdem ist die Kiste ja auch Softwarekalibriert).

    Parameteränderungen und Modulationmatrix-Änderungen erzeugen daher Unterbrechungen im Sound, da eben die 'Engine' neu erzeugt wird. Die Modulationen selber natürlich nicht, die werden dann ja innerhalb der 'erzeugten' Engine berechnet.
     
  5. Danke für die Antworten. Den Quellcode des AVRSyn hatte ich mir schon angeschaut, finde ihn aber dank Kommentararmut nicht sehr verständlich.

    Ich schreib mal kurz wie ich es jetzt verstanden hab:

    Es gibt einen Interrupt, der immer nach einer bestimmten Zeit (z.B. alle 50ms, je öfter, umso besser) aufgerufen wird, der seiner Variablen ausliest, in einer großen Formel die aktuellen Zustände der Steuerspannungen berechnet und dann ausgibt.
    Die Variablen füllt man dann ganz normal im Hauptprogramm mittels Reglerabfrage oder aus dem Programmspeicher.
     
  6. Anonymous

    Anonymous Guest

    Hm... wie in jedem Echtzeitsystem ist das, was du Hauptprogramm nennst die Idle Task: die tut nix, weil man die CPU ja nicht solange ausbauen und vermieten kann...

    Es passiert *alles* im Interupt.
    Die 120Hz vom Matrix sind etwas schnarchnasig, Reaktor nimmt per Default 400Hz, so bis 2kHz scheint mir für Clickzeugs sinnig. Dadrüber würde ich gleich auf Audiorate setzen (die Clavias machen das), dann kann man die Modulationen eben bis weit in den Audiobereich drehen, das ganze wird dann mehr eine Hybridlösung. Braucht dann aber einen DSP.


    Vom Matrix hab ich das Eprom ausgelesen und dissassembliert, bei dem Engine-Code dachte ich zunächst dass ich da irgendeinen Datenbereich erwischt hatte, der Trick ist wirklich die "Modulationsformel" *effizient* zu berechnen.
    Jedenfalls würde ich sowas heute eher mit reichlich Rechenleistung machen (gibt es ja billig) statt da Monate am Code zu fummeln.
     
  7. Naja, Hauptprogramm deshalb, weil es main heißt. :) Schon klar, daß das nicht so oft zum Zuge kommt.

    Werd wohl einen DSP nehmen, das mit den Preisen ist ja wirklich nicht mehr so. Und je höher die Interruptrate um so besser.

    Hab schon mal mit einem VSTi angefangen, das läßt sich schneller testen, da ich auch noch keine Hardware habe.

    Was ist denn eine schöne Kurve für die Hüllkurven? Logarithmisch? Oder gibts da einen paar Geheimtipps?
     

Diese Seite empfehlen