Jump to content

AVR-Synthesizer "WAVE 1"


rolfdegen
 Share

Recommended Posts

Hallo zusammen

Ich war mal wieder fleißig und habe die letzten Wochen am AVR-Synthi gebastelt
bzw programmiert. Herausgekommen ist eine neu gestaltete Menü-Seite für die
DCO Einstellung. Was eigentlich sehr einfach klingt, hat mir doch etwas Kopf-
zerbrechen gemacht. Die Einstellung der DCO's sollte Ãœbersichtlich und einfach
zu bedienen sein.

Bild 1: DCO-Menü

Waveselect_01.jpg



Herausgekommen ist eine Wellenform Auswahl-Matrix für beide DCO's um ver-
schiedene Wellenformen zu kombinieren. Mit der internen Wellenform-Tabelle
(ca. 22KByte) bestehend aus den Bandlimited Waves (Square, Saw, Triangle)
und Synthezizer-Waves sind zur Zeit etwas mehr als 500 Wellenform Kombi-
nationen möglich. Soundbeispiele wirds hier später geben.

Ferne besteht die direkte Möglichkeit, mit dem Detune-Regler die DCO's gegen-
einander zu verstimmen um einen Schwebungeffekt im Sound zu erreichen. Mit
den Schaltern "Soft" und "Hard" kann man die Stärke des Reglers einstellen. Der
"Sync"-Button synchronisiert beide DCO's wieder und stellt den Detune-Wert
wieder auf null.

Bild 2: Auswahl der Synthesizer-Waves

Waveselect_02.jpg



Eine etwas schwierige Aufgabe war die Wellenform Auswahl für die Synthesizer-
Waves. Das habe ich durch ein Untermenü bewerkstelligt. Klickt man auf den
"WAV"-Button öffnet sich eine neue Menüseite für die Auswahl der Waves und der
grafischen Ansicht der Wellenform.


Bild 3: Wellenform-Kombination einer Saw-Waveform und Synthesizer-Waveform

Waveselect_03.jpg


Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Irre, das scheint ja ziemlich flexibel zu werden!

kleine Kritik am Detune-Konzept: Wenn ich das richtig verstehe, kannst du so entweder eine hohe oder eine niedrige Verstimmung einstellen, was ist aber mit einer Kombination?

Verstimmt man die DCOs um eine Oktave + ein paar Cents ergibt das auch eine interressante Schwebung. Außerdem könnte man "sync" für Oszillatoren-Synchronisation( wie z.b. im SID) halten, was es ja aber nicht ist, oder?

Link to comment
Share on other sites

Hallo amp

Das Detune-Konzept ist vielleicht noch nicht ganz ausgereift. Die Detune-Funktion "Hard" und "Soft" funktionieren summierend. Das bedeutet, mit "Hard" stelle ich den Detune-Wert auf eine grobe Schwebung ein und kann dann mit "Soft" diese genauer justieren. Es wird eine zusätzliche Möglichkeit geben, beide Oszillatoren zu Oktavieren bzw in Halbton-Schritten zu verstellen. Ferne habe ich jetzt zu der Additiven Synthese und FM Synthese einen Ringmodulator integriert. Die Synchronisation werde ich allerdings noch einmal überarbeiten, so das sie richtig funktioniert.

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Hallo

Ich komme einfach nicht weiter in Bezug auf die Tune-Funktion des

Oszillators in meinem AVR-Synthi.

Um die Midi-Note 1-127 in eine Tonfrequenz umzuwandeln greife ich auf

eine 16Bit Tabelle mit 127 Frequenzwerten im Flash-Speicher des Xmegas

zu. Wenn ich zB Oszillator2 eine Oktave tiefer stellen möchte, dann

teile ich einfach den Frequenzwert der Midi-Note. Funktioniert auch

problemlos und über alle Oktaven sehr genau. Aber wie kann ich den

Oszillator um einen Halbton verstellen. Ich möchte später mit der

Tune-Funktion den Oszillator um +-24 Halbtöne verstellen können. Alle

meine Berechnungen liefern "Krumme Werte" so das eine genaue Einstellung

nicht möglich ist.


//***********************************************

// Frequenz_Tune

// Wiedergabefrequenz mit Tune-Werten berechnen

// 

// noten_nr = Midi-Key_Nr.

//***********************************************

void frequency_tune()

{

     frequenz = pgm_read_word (&(midi_frequenz[noten_nr]));

     schrittweite1 = (__uint24) 411 * frequenz;  // Phasendelta für Oszillator1


     schrittweite2 = (__uint24) 411 * frequenz >> 1; Phasendelta für Oszillator2 (eine Oktave niedriger)


Gruß Rolf

Link to comment
Share on other sites

Ist eigentlich klar, oder? Von einem Halbton zum nächst höheren ist eine Multiplikation mit der zwöflten Wurzel von zwei (1,0594630943592952645618252949463...). Da tut man sich mit fixed-point Mathe etwas schwer. Nimm doch für das Detune nicht den Frequenzwert, sondern hol einfach den entsprechenden Wert (note + detune) aus der Tabelle (die Du dann um 24 Zeilen vorne und hinten erweitern solltest).

void frequency_tune() {
frequenz1 = pgm_read_word (&(midi_frequenz[noten_nr]));
schrittweite1 = (__uint24) 411 * frequenz; // Phasendelta für Oszillator1

frequenz2 = pgm_read_word (&(midi_frequenz[noten_nr-12])); // eine Oktave drunter
schrittweite2 = (__uint24) 411 * frequenz2; // Phasendelta für Oszillator2 (eine Oktave niedriger)

detune = 7;
frequenz3 = pgm_read_word (&(midi_frequenz[noten_nr + detune])); // eine quinte drüber
schrittweite3 = (__uint24) 411 * frequenz3;
[/code]

Die gängige Nomenklatur für "hard" und "soft" ist übrigens "transpose" und "finetune".

[size=1]Du musst/solltest übrigens keine Zeilenumbrüche nach jeder Zeile in Dein Posting einfügen. Das geht von ganz alleine und passt dann auf allen Monitoren...[/size]

Link to comment
Share on other sites

Hallo

Ich habe Heute die Menü-Seite für die DCO-Einstellung fertig gestellt (siehe Bild).
Jeder Oszillator kann in +-24 Semitone-Schritten (entspricht +- 2 Oktaven) verstellt
werden. Zusätzlich kan man mit der Fine-Einstellung (Schrittweite +-100 Cent) den
Oszillator zwischen zwei Halbtönen verstimmen. Mit den Tasten "+" und "-" ist außer-
dem eine genauere Einstellung der Parameter möglich.


Bild: DCO-Einstellung im AVR-Synthi

DCO_Tune_01.jpg


Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Hmm, irgendwie gibt's für die hier gemachten Vorschläge nie Feedback...

Du musst/solltest übrigens keine Zeilenumbrüche nach jeder Zeile in Dein Posting einfügen. Das geht von ganz alleine und passt dann auf allen Monitoren...

Link to comment
Share on other sites

Hallo nILS

Danke für deinen Vorschlag. Ich hab das programmtechnisch etwas anders gelöst (siehe Code). Der Versuch mit direkten Ton-Frequenzen für jede Midi-Note zu rechnen, führte immer zu Ungenauigkeiten bei den Semitone-Werten. Die Tabelle besteht jetzt nur aus 14 PhasenDelta-Werten für die 1.Oktave und eine Halbton-Note oberhalb und unterhalb der 1.Oktave. Aus diesen Werten werden die restlichen Halbtöne abgeleitet und berechnet.

inNote = Midi-Noten-Wert (Key-Nr.)

inSemi = +-24 Semitones

inFine = +-100 Cent


//*********************************************

//

//   PhaccuDelta-Value from Midi Note-Nr. 0-11

//

//	 Phaccu_Delta = 411 * Midi-Note Frequenz

//

//*********************************************

uint16_t phaccu_delta [14] = { 

	3171,		// B-1

	3360,		// C1	// Midi-Note 0-11

	3560,

	3771,

	3996,

	4233,

	4485,

	4752,

	5034,

	5334,

	5651,

	5987,

	6343,

	6720 	   // B+1					  

};



//***********************************************

// Frequenz_Tune

// Wiedergabefrequenz mit Tune-Werten berechnen

//***********************************************

void frequency_tune()

{

	 uint8_t fNote;

	 uint8_t inNote = noten_nr;

	 char inSemi = -12;

	 char inFine = 0;

	 uint8_t fFineByte;

	 uint8_t fOctave;

	 uint8_t fPitchIndex;

	 uint16_t fPitch1;

	 uint16_t fPitch2;

	 int16_t fPitchDiff;

	 __uint24 outPitch;


	 //--------- Tune DCO1 -------------------

	 fNote = inNote + inSemi;

	 if(fNote & 0x80) fNote = 0;

	 fOctave = fNote / 12;

	 fPitchIndex = (fNote % 12);

	 fPitch1 = phaccu_delta[fPitchIndex+1];

	 if (inFine > 0)fPitchIndex+=2;

	 fPitch2 = phaccu_delta[fPitchIndex];

	 fPitchDiff = (int16_t) (fPitch2-fPitch1);

	 fFineByte = ((uint8_t)(abs(inFine))) << 1;

	 outPitch = (__uint24)(((((int32_t)fPitch1)<<8) + ((int32_t)fPitchDiff*(int32_t)fFineByte)) >> 8);

	 outPitch <<=fOctave;

	 schrittweite1 = outPitch; 

Besten Dank an Maik aus dem mikrocontroller.net-Forum für die großartige Unterstützung.

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Doch, letztendlich machst Du genau das, was ich vorgeschlagen hab. Nur dass Du eben nur einen ein-oktavigen Lookup-Table nimmst und den Rest daraus extrapolierst. Was den Charme hat, dass Du nur einen sehr kleinen Table brauchst und Deine Frequenzen innerhalb des Synthies zueinander passen - andererseits nimmst Du damit alle Rundungsfehler der ersten Oktave in alle anderen Oktaven mit, sprich es gibt keine Korrekturen für die Fehler (siehe z.B. B0 = 3171, B1 = 6343, B1 != 2*B0). Und damit hängst Du in sehr vielen Fällen ein paar cent neben dem eigentlichen Ton, was das Zusammenspiel mit anderen Synthies etwas unangenehm machen könnte.

phaccu[13] ist übrigens nicht B+1 sondern C2 :whistle:

Link to comment
Share on other sites

Hallo Nils

Die Kunst ist es, einen Digitalen Synthi nicht zu steril klingen zu lassen. Ein wenig daneben klingt vielleicht besser.

Nein.. kleiner Scherz :) Du hast natürlich Recht. Man könnte es vielleicht später mit einer größeren Tabelle genauer machen.

Mal schaun ob dafür noch genug Platz im Flash-Speicher übrig ist. Die einzelnen Noten-Frequenzen sind aber schon sehr genau.

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Tolles Projekt Rolf!

Ich bin schon sehr gespannt auf neue Soundsamples.

Ist der Synthi nur als monophone Version mit einem Filterbaustein geplant, oder ist auch Polyphonie ein Thema?

Den Aufbau des Detuner würd ich nochmal überdenken.

Ich bin ein großer Freund von Technik die von jedem sofort und intuitiv benutzt werden kann.

Dein Detuner ist auf den ersten Blick ein wenig unübersichtlich.

Mein Tip hier ist - bau den Detuner so simpel wie möglich. Warum das Rad neu erfinden?

Für jeden Oszillator zwei Parameter :

1. Transpose (+/- 24 oder 36 in Halbtonschritten)

2. Detune (+/-99 in Cent, wobei 100 Cent einem Halbtonschritt entsprechen)

Eine Slidergrafik würde ich hier nicht benutzen, denn die nimmt zuviel Platz weg und bringt eigentlich keinen Mehrwert..

Ich würde simple Up/Down Buttons mit dem Zahlenwert dazwischen benutzen.

Das könnte im Display dann etwa so aussehn:

Osc1:

Transpose: < +24 >

Detune: < 99 >

Osc2:

Transpose: < -24 >

Detune: < 99 >

Eine solche Aufteilung empfinde ich persönlich als deutlich übersichtlicher, denn man kann alles ohne Zwischenklicks sofort editieren.

< und > repräsentieren hier nur die entsprechend grafisch aubereiteten Buttons.

Der angezeigte Wert könnte gleichzeitig als eine Art Semi Slider benutzt werden, wenn größere Wertesprünge gewünscht sind.

Ich hab ich auch noch ein paar weitere Anregungen für "mögliche" Erweiterungen deines Konzepts :

1. WIe wäre es beispielsweise wenn du die Möglichkeiten der Oszis mittels Phase Distortion noch erweiterst?

Wer die CZ Synthis von Casio aus den 80ern kennt, der weiß was ich meine. Tolle Synthies!

Damit kann man in Verbindung mit einer Hüllkurve schon auf Oszillatorebene filterähnliche Effekte mit einem sehr eigenen Sound erzeugen.

http://en.wikipedia....rtion_synthesis

Aliasing könnte man bei steigender Frequenz durch Filterung Richtung Sinus vorbeugen, also ein ähnlicher Ansatz wie beim Shruti.

Der Vorteil durch Filterung läge hierbei darin, daß der Benutzer die Intensität dieses Effekts übers Menü noch nach Bedarf skalieren könnte - manchamal klingt solcher digitaler Schmutz auch ganz nett und gibt "Charakter".

2. Es fehlt auf jeden Fall ein flexibel routbarer Ringmodulator in deinem Konzept. Ohne wär der Synth nicht vollständig. <grins>

3. Dem Noisegenerator könnte man auch ein paar Extrafunktionen spendieren um verschiedene Arten Rauschen zu erzeugen. Wenn das ganze noch modulierbar wäre...

4. Freie Hüllkurven/LFOs mit MIDI Clock Unterstützung und eine umfangreiche Modulationsmatrix wären auch noch ein Thema.

Ich löte zwar ganz gerne mal was nach, aber bin leider kein Harwareentwickler/Programmierer sondern Produzent und Audio Engineer und hab daher keine Ahnung, wieviel davon sich auf dem 128er überhaupt realisieren lässt, also sehe mir das bitte nach, falls ich hier über die Möglichkeiten des Prozessors hinausschieße.

Edited by Thomasch
Link to comment
Share on other sites

Hallöchen..

Damits hier nicht zu langweilig wird, gibts zur Abwechslung ein paar
Demo-Sound. Was in den Sounds noch fehlt, ist die Filter und
Amplituden-Modulation sowie FM und Synchronisation der Oszillatoren.

AVR-Synthi Demo-Sounds
https://soundcloud.com/rolfdegen/avr-demo-31102012

Edited by rolfdegen
  • Like 1
Link to comment
Share on other sites

Hallo Thomasch

Danke für dein Lob. So einen Synthesizer zu entwickeln ist schon eine große Herausforderung für mich. Ich habe mir das alles viel leichter vorgestellt. Aber jeden Tag gewinne ich neue Erkenntnisse und kann sie in das Projekt einfließen lassen und den AVR-Synthi dadurch verbessern. Die Menü-Seite mit der Einstellung für die Oszillatoren ist noch nicht perfekt gelöst, da werde ich mir noch was besseres Einfallen lassen. Diesbezüglich danke für den guter Tip von dir.

Aber es sind noch viele Dinge im AVR-Synthi, an denen ich schrauben und programmieren muss. Auf jeden Fall danke ich die für deine Tips. Mal schaun was ich davon noch alles umsetzen kann.

In Bezug auf deine Frage nach einer Polyphonie muss ich dich leider enttäuschen. Dafür reicht die Rechenleitung des Xmega-Prozessors nicht. Aber der AVR-Synthi besitzt zwei getrennte Audioausgänge und zwei Filterbausteine die unterschiedlich angesteuert bzw moduliert werden können. Dadurch ist so eine Art Pseudo-Stereo möglich.

Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

  • 2 weeks later...

Hallo zusammen

Ich habe das Menü für die Oszillator Einstellung nach einer Idee von Thomasch geändert. Es sieht jetzt übersichtlicher aus und ist einfacher zu bedienen. Um die Werte für Transpose und Detune zu ändern, tippt man einfach auf den Zahlenwert zwischen den beiden Pfeilen. Diese fangen an zu blinken und man kann jetzt über den Fader oder den ext. Drehencoder den Wert verändern.

Achso.. hab ich ganz vergessen. Der AVR-Synthi besitzt jetzt einen Drehencoder. Damit lassen sich die Parameter viel leichter programmieren als über das Touch-Display. Gerade wenn man sehr kleine Wertänderungen programmieren möchte wzB Schwebungseffekte funktioniert das über den Drehencoder sehr genau.

Bild 2: Neues Tune-Menü im AVR-Synthi

Tune_Menu.jpg


Bild 2: Altes Tune-menü im AVR-Synthi

DCO_Tune_01.jpg



Gruß Rolf

Edited by rolfdegen
Link to comment
Share on other sites

Hallo zusammen

Ich habe das Menü für die Oszillator Einstellung nach einer Idee von Thomasch geändert. Es sieht jetzt übersichtlicher aus und ist einfacher zu bedienen. Um die Werte für Transpose und Detune zu ändern, tippt man einfach auf den Zahlenwert zwischen den beiden Pfeilen. Diese fangen an zu blinken und man kann jetzt über den Fader oder den ext. Drehencoder den Wert verändern.

Achso.. hab ich ganz vergessen. Der AVR-Synthi besitzt jetzt einen Drehencoder. Damit lassen sich die Parameter viel leichter programmieren als über das Touch-Display. Gerade wenn man sehr kleine Wertänderungen programmieren möchte wzB Schwebungseffekte funktioniert das über den Drehencoder sehr genau.

Hallo Rolf,

Ich finde das sieht um einiges besser und übersichtlicher aus, als der Urentwurf!

Den Wertebereich für Detune würde ich noch auf 99 begrenzen, denn die vollen 100 brauchste zum detunen eh nicht, das entspricht ja einem vollen Halbton und für Halbtöne hast du ja den Transpose Wert.

Dadurch würde auch die Leerstelle zwischen Zahl und > nicht "gefressen".

Den Slider würd ich komplett wegrationalisieren und die Sliderfunktion direkt auf die Zahlen legen.

Durch den rechts eingesparten Platz könntest du auch die Pfeile/Zahlen noch weiter auseinander ziehen, damit man besser trifft. Das sieht auf dem Bild noch etwas eng beieinander aus.

Ansonsten - Daumen hoch!

Gruß

Thomasch

Edited by Thomasch
Link to comment
Share on other sites

Hallo Thomasch

Danke für den Tip mit dem Detune-Wert. Werde ich nach deinem Vorschalg anpassen, so das der Wert von +99 bis -99 geht. Deine Idee mit dem waagerechten Slider werde ich mir noch einmal überlegen. Mal schaun obs mir vom Designe gefällt und auf dem kleinen Touch-Display umsetzbar ist.

Bis dahin schöne Grüße. Rolf

Link to comment
Share on other sites

Hallo nILS

Der maximale Detune-Werte liegt intern eigentlich bei -128 +127. Das entspricht einem Halbton. Würde ich diesen Wert für die Anzeige halbieren käme ich auf einstellbare Detune-Werte von -64 +63. Damit würde ich aber auch die feine Detune-Auflösung reduzieren. Was ist jetzt musikalisch sinnvoll ?

Link to comment
Share on other sites

Hi Rolf,

ich glaub Nils meinte, man könnte dann ja einen ganzen Halbton hoch- oder runtergehen (coarse tune) und dann das Feintuning nur jeweils nur auf +/- der Hälfte eines Halbtons begrenzen um Überlappung auszuschliessen, also auf -64/+63.

Cooles Projekt übrigens!

Ciao,

Peter

Link to comment
Share on other sites

Den fehlenden Rest hab ich einfach untern Tisch fallen gelassen.

Ich werde das jetzt so gestalten das ich auf der Anzeige Detune-Werte von -64 und +64 darstelle und diese intern mit 2 multipliziere.

Na wenn du keinen Wert darauf legst das sauber auf die Centskala zu legen, dann kannste auch den vollen 127er Bereich ausnutzen und das Multiplizieren weglassen.

Je feiner, um so genauer kannst du mit Schwebungen spielen.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...