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
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.
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.
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)?
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.
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
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.
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.
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?
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.
Datum:
Hallo, Ich suche eine Funktion in c um eine Hüllkurve zu berechnen. kannst Du bitte diesen codeschnippsel Posten?
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.
Datum:
wow, ziemlich cooles Projekt! :) Bei Gelegenheit werde ich es austesten. Gruß Stephan
