www.mikrocontroller.net

Forum: Codesammlung 17 Kanal Avr Synthesizer in Asm


Autor: Samuel K. (sam1994)
Datum:
Angehängte Dateien:

Hi zusammen

Nach längerer Zeit wage ich die erste Veröffentlichung meines
Synthesizer (Anfang: Beitrag "AVR Synthesizer Konzept" ).
Der Synth hat folgende Eigenschaften:
- 17 frei konfigurierbare Kanäle mit:
  - Hüllkurven
  - Volume
  - (pulsierende Volume (geplant))
  - (Vibrato (geplant))
- Sehr schnell und effient < 1Mhz / Kanal
- läuft ab 2,9Mhz
- 44,1kHz Samplingrate
- Bisher 7 Intrumente (beliebig erweiterbar)
- 16bit Berechnung
- 6-9bit PWM Sound

Die Intrumente sind nicht so gut gelungen, es ist aber auch schwer aus
einem 256 Wavetable verschiedene Intrumente zu erzeugen.

Der Synthesizer läuft mit allen Atmegas, mit der Einschränkung, dass man
beim Atmega48 die Kanäle reduzieren muss (SRAM reicht nicht).

Bei 17 Kanälen braucht der Synth ~670Byte Ram und bei 7 Instrumenten
3196Byte.

Der Synth nutzt ein eigenes Dateiformat um Stücke abzuspielen, genaueres
steht im Code. Ich habe auch einen Converter programmiert, welcher die
Midi-Dateien konvertiert. Jedoch mischt dieser die Stimmen und beachtet
auch keine anderen Midibefehle außer Noten.

Schlagzeug kann er auch nicht, allerdings konvertiert der Konverter
dieses als Tiefen kurzen Ton, was sich z.T ähnlich anhört.

Zur Hardware gibt es nicht viel zu sagen: Man nimmt einen Mega und hängt
an seinen 16bit Timer PWM Ausgang einen Lautsprecher dran. Evtl. noch
ein Tiefpass davor.


Anbei zwei Aufnahmen, des Synthesizers bei 7bit PWM @8Mhz @44100Hz mit 4
Kanälen.

Euch nun viel Spaß damit!

Grüße,
Samuel
Autor: Samuel K. (sam1994)
Datum:
Angehängte Dateien:

Hier noch der Converter. Die Exe befindet sich unter
SequencerDemo\Bin\Debug.

Ich muss noch dazusagen: Der Konverter funktioniert manchmal nicht so
richtig. Das liegt wahrscheinlich am Timing. Einen richtiger
Midikonverter liest eben die Mididatei und konvertiert sie dabei und
spielt sie nicht ab während er die Midisignale abfängt.
Autor: Samuel K. (sam1994)
Datum:
Angehängte Dateien:

Hier nochmal 2 Beispiele, welche die Leistung des Synthesizers
demonstrieren (er läuft immer noch mit seinen schiefen 8Mhz (man müsste
ihn mal stimmen):
- Cantine Band (Star Wars): 9 Kanäle
- Mario: 8 Kanäle

Die Stücke werden leider nicht vollständig gespielt, da Flash voll ist.
Bei beiden wurde der Atmega8 mit ~8000Byte programmiert. Wahrscheinlich
läuft es letzendlich auf eine SD-Karte hinaus.

Solltet ihr Fragen, bzw. (Verbesserungs-)Wünsche haben, stellt sie
ruhig.
Autor: Mario Grafe (mario)
Datum:

Sehr schick! Wie sieht denn die Beschaltung des AVR aus? Lautsprecher
via C an PWM-Kanal oder hast du nur LineOut erzeugt (direkt an PC)?
Autor: Samuel K. (sam1994)
Datum:
Angehängte Dateien:

Die Beschaltung des Avrs hab ich angehängt (aus Klangerzeugung). Zum
Aufnehmen schließe ich keinen Lautsprecher an, sondern gehe mit dem
Kabel zum LineIn.
Autor: chris (Gast)
Datum:

>Hier nochmal 2 Beispiele, welche die Leistung des Synthesizers
>demonstrieren

Klingt gar nicht schlecht. Ein großes Lob für Deine Arbeit von mir.

Ich könnte mir Vorstellen, dass es reichen würde, die Wavetable-Sounds
mit nur 4 Bit zu digitalisieren, da Du ja beim Mischen sowieso Dynamik
verlierst. Ich habe vor einiger Zeit experimentiert und 4 Bit klangen
auch noch gut. Eventuell könnte man auch sowas wie my-law oder a-law
Kompression machen. Dann dürfte allerdings die Kanalzahl etwas weniger
werden.


Gruß,
chris
Autor: Samuel K. (sam1994)
Datum:

chris schrieb:
> Ich könnte mir Vorstellen, dass es reichen würde, die Wavetable-Sounds
> mit nur 4 Bit zu digitalisieren, da Du ja beim Mischen sowieso Dynamik
> verlierst.
Das stimmt, Dynamik geht verloren. Ein 4bit Table auszulesen kostet halt
2 Takte mehr. Die ganze Routine ist nur so schnell, weil eigentlich nur
berechnet und gemischt (10 Takte) und das für die nächsten 64 Samples.
Variablen werden vorher geladen. Der Hüllkurvenwert wird vorher mit der
Lautstärke multipliziert. Bei der Tonerzeugung gibt temp2 das Intrument
an. temp2 wird in ZH geschrieben und der richtige Wavetable wird
ausgelesen. Deswegen wäre Kompression eher fatal.
;Frequenzähler
add Ztemp, hrfreq      ;zum Zähler addieren
adc temp, hrfreq2

;Tonerzeugung (Sample auslesen)
movw Z, temp:temp2
lpm presc, Z

;Lautstärke
mulsu presc, volsum

;Zum Rest mischen
add sample, r0
adc sample2, r1

 Ich werde versuchen den Synthesizer + SD-Karte in einen Atmega8 zu
bekommen. Elm-Chans PetitFat Dateisystem scheint das kleinste im Netz zu
sein, damit werde ich es probieren.
Autor: Samuel K. (sam1994)
Datum:
Angehängte Dateien:

Ein paar Bugfixes: Der 8bit pwm Modus lief nicht, komischerweise kann
man das Lowbyte des OCR1A Registers nicht ohne das Highreg schreiben.
Ich finde den Klang im 8bit Modus deutlich besser. Außerdem
funktionierte die Tonfrequenzrechnung nicht richtig (Töne waren von
F_CPU abhängig). Anbei noch den Entertainer im Drehorgelsound.

Zurzeit versuche ich den Synth um eine SD-Karte zu erweitern, dafür muss
ich den Asmcode wahrscheinlich nach C portieren, da es kaum gute
asm-sd-libs gibt.
Autor: Klaus (Gast)
Datum:

Klasse Projekt, freu mich auf den C Code.
Autor: Bastler (Gast)
Datum:

Wie Stehts mit dem Projeckt?

Welche Instrumente kann er schon Immitieren?

Wäre auch (E)Gitarre möglich?
oder Hammond-Orgel?

Sind zwei verschiedene Instrumente gleichzeitig Möglich?
Autor: Samuel K. (sam1994)
Datum:

Projekt läuft noch. Die Portierung nach C ist inzwischen abgeschlossen,
er kann auch Dateien von der SD-Karte abspielen. Diese müssen von midi
erst konvertiert werden (neuer Konverter ist auch schon programmiert).
Da der Grundaufbau nun fertig ist, gehts es leider jetzt erst an neue
Instrumente (derzeit ist nur ein Testinstrument implementiert).

Wenn man die SD-Karte nutzt, passt es leider nicht mehr in einen Mega8:
Die SD-Karten-Ansteuerung braucht 700B, dazu kommen noch 256B
Lesepuffer.

Bastler schrieb:
> Wäre auch (E)Gitarre möglich?
> oder Hammond-Orgel?
Es sind alle Instrumente möglich - die andere Frage ist wie gut sie
nachgeahmt werden können. Das neue System nutzt (wie ElmChans Synth
auch) je 256 Samples für Attack (Anschwingen des Tons) und für Sustain
(Nachklang).

> Sind zwei verschiedene Instrumente gleichzeitig Möglich?
Ja, jeder Kanal kann ein eigenes Instrument spielen.
Autor: harry (Gast)
Datum:

Hallo,
Ich suche eine Funktion in c um eine Hüllkurve zu berechnen.
kannst Du bitte diesen codeschnippsel Posten?
Autor: Samuel K. (sam1994)
Datum:

Was für eine Hüllkurve? Ich berechne nur das Abklingen durch eine
Parabel:
Am Anfang wird eine 8bit Variable auf 255 gesetzt. Diese wird im
Timer-Interrupt um einen Wert, der die Abklinggeschwindigkeit bestimmt,
erniedrigt. Zum Berechnen der Hüllkurve wird das Sample mit dem Quadrat
des Wertes multipliziert.
Autor: Samuel K. (sam1994)
Datum:

Autor: Stephan M. (stmz)
Datum:

wow, ziemlich cooles Projekt! :)
Bei Gelegenheit werde ich es austesten.

Gruß
Stephan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net