Jeannie Polyphonic DIY Synthesizer

Zur Jeannie. Bevor wir hier in Teufels Küche kommen, Jeannie kommt NICHT von der Film (Jeannie ) sondern ist vom Teensy abgeleitet .
Ich werde auf gar keinen Fall irgendwelche Jeannies auf das Gehäuse zeichnen. Denke auch die Bilder haben ein Urheberschutz.

G
Andre'
 
Lassen sich die Ausfräsungen in der Panelplatte als Einfräsungen anstatt Durchfräsungen fertigen, die Laschen in den Seitenteilen entsprechend flacher, so dass die Deckplatte geschlossen bleibt?
Oder lässt Du das lasern?
Ist noch teurer als wenn man gleich ein ganzes Gehäuse machen läßt.
Ein metall Gehäuse würde zwischen 70..80 € kosten.
Die Frage ist , wie viele Leute würden es hier kaufen da ich mindestens 50 Gehäuse vorfinanzieren muss.

G
Andre'
 
@ Andre' Da habe ich mich nicht ordentlich ausgedrückt.
Ich bezog meine Frage auf das Kunststoffgehäuse.
 
@ Andre' Da habe ich mich nicht ordentlich ausgedrückt.
Ich bezog meine Frage auf das Kunststoffgehäuse.
Ach so, ich lasse die Plexiglas Gehäuse lasern . Da ist sowas nicht möglich. Das Plexiglas Gehäuse ist doch sehr stabil. Die Shruthi Gehäuse waren von anfang an eine Katastrophe. Deshalb habe ich sehr viel Wert darauf gelegt das das Gehäuse für Jeannie nicht so klappert . Vieleicht ist ja hier im Forum jemand mit einer Fräse und Lust Gehäuse zu machen ??
 
Hallöchen..

Bin gerade noch dabei, eine SuperSaw in der Jeannie zu integrieren. Pro Oszillator 6 Sägezähne. Das entspricht dann 12 pro Stimme.

Leider klingt das Ganze noch nicht richtig. Unten mal der Quellcode und eine Hörprobe mit einem Oszillator.
Vielleicht hat ja jemand eine Idee dazu 🤔


SuperSaw Osc1
Code:
// Phase increment for SupperSaw
    saw_inc32 += 1300000;  (every 44.1KHz)
 
case WAVEFORM_SUPERSAW:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
            uint32_t ph_1 = phasedata[i];
            uint32_t ph_2 = ph_1 + saw_inc32;
            uint32_t ph_3 = ph_1 + (saw_inc32 << 1);
            uint32_t ph_4 = ph_1 + (saw_inc32 << 2);
            uint32_t ph_5 = ph_1 + (saw_inc32 << 3);
            uint32_t ph_6 = ph_1 + (saw_inc32 << 4);
            int16_t val_1 = signed_multiply_32x16t(magnitude >> 2, ph_1);
            int16_t val_2 = signed_multiply_32x16t(magnitude >> 3, ph_2);
            int16_t val_3 = signed_multiply_32x16t(magnitude >> 3, ph_3);
            int16_t val_4 = signed_multiply_32x16t(magnitude >> 3, ph_4);
            int16_t val_5 = signed_multiply_32x16t(magnitude >> 3, ph_5);
            int16_t val_6 = signed_multiply_32x16t(magnitude >> 3, ph_6);
            *bp++ = val_1 + val_2 + + val_3 + + val_4 + + val_5 + val_6;  // result to Buffer
        }
    break;

SuperSaw

SuperSaw1.PNG
 

Anhänge

  • SuperSaw.mp3
    486,4 KB
Zuletzt bearbeitet:
Ich hab' keine Ahnung welche Möglichkeiten du hast, kannst du irgendwie die Phase der einzelnen Sägezähne gegeneinander verschieben? Zusätzlich vielleicht die Tonhöhe um einen Bereich der Originaltonhöhe variieren und kannst du verschiedene Versionen des Sägezahns addieren, idealerweise nimmt der Gehalt an tiefen Frequenzen abhängig von der Verstimmung zueinander ab, genau wie die Sache mit der Phase - um Auslöschungen/Kammfilter Effekte zu vermeiden.
 
Hallo Rolf,
mein FPGA-Synthi hat mittlerweile auch ne SuperSaw. Bis zu 12x Sägezahn + jeweils synchroner Suboscillator (-1 oder -2 Oktaven). Das Verstimmen der Oscillatoren mache ich mit nem Zufallsgenerator-Anteil (auf Primzahlenbasis) d.h. jedesmal wenn man den DeTune-Grad ändert, wird etwas "gewürfelt", so daß nie ganzzahlig-vielfache oder ähnlich abhängige Verstimmungen rauskommen. Klingt ziemlich fett!

Edit: diese lang-periodischen Auslöschungen kommen, weil irgednwas in den Verstimmungen noch zu synchron ist.... meiner hat das auch gemacht als ich noch mit festen Verhältnissen verstimmt habe, jedoch macht das gar nicht mehr nachdem ich den Zufallsfaktor eingebaut habe.

Grüße,
Dirk
 
Zuletzt bearbeitet:
Anbei ein Soundbeispiel meiner SuperSaw (im ersten Teil ohne Verstimmung, im zweiten Teil mit zunehmender Verstimmung. Anhängend auch ein Screenshot der Waveform.

@Rolf: veränderst du nur die Phase oder verstimmst du die Tonhöhe? Auch sieht es in deinem Codebeispiel so aus, als hätte die erste Waveform (val_1) eine höhere Amplitude als die anderen.

Anbei auch ein Codeschnipsel wie ich etwas Zufälligkeit in die Verstimmung reinbringe:

Code:
          while (index<DASCFG_IMPLEMENTED_WAVEFORM)
          {
            tunevalue_ch[index] = tunevalue_osc1;   
            if (channelnumber>0 && detunevalue_osc!=0)
              tunevalue_ch[index] += ((channelnumber + (Max(1,(currenttick % primenumber[channelnumber-1])))) * detunevalue_osc) + (currenttick % primenumber[index+5]);   
            index++;
            channelnumber++;
          }

SuperSaw-v1.png
 

Anhänge

  • 026-SuperSaw-v1.mp3
    1,1 MB
Zuletzt bearbeitet:
ist das der inkrement- und additions-Operator? Oder wären das 3 "+"? 🤔
 
ist das der inkrement- und additions-Operator? Oder wären das 3 "+"? 🤔

Ein Buddy von mir hat das mal mit verschiedenen Konstellationen (++, +-, -+) getestet und es ist wohl so, daß das erste Zeichen als Operator und das zweite Zeichen als Vorzeichen des folgenden Operanden gedeutet wird. "a ++ b" (-> a + (+b) ) hat somit keine andere Wirkung als ein einfaches "a + b". Aus "a+-b" oder "a-+b" wird jedoch "a-b" werden (von "a--b" mal ganz zu schweigen...).


Hir mal etwas Fachlektüre.

Das Dokument ist echt interessant. Ich seh mich bestätigt in meinen Versuchen, etwas Zufälligkeit in das DeTuning reinzubringen. Zufälligkeit auf die Phase ist vielleicht auch interessant. Das mit dem Hochpassfilter war mir neu, das probier ich mal. Danke dafür.

Nachtrag: Ich habe das mit dem im Dokument erwähnten Hochpassfilter (mit Key-Follow) ausprobiert und hätte nicht gedacht, daß das so viel bringt.
@Rolf: solltest du unbedingt probieren!
 
Zuletzt bearbeitet:
@Rolf: Deine Doppelplusse (doppelplus-gut?? :frolic:) haben mich etwas ins Grübeln gebracht aber ich meine sie haben auf das Ergebnis keine ungewollten Auswirkungen.

Ups.. Kleiner Fehler im Text. In der Berechnung sollte natürlich nur ein Plus Zeichen sein.
Das Shiften beim Saw_inc32 habe ich geändert und es durch einen Multiplikator ersetzt.
Ferner habe ich den magnetude für die Phasen so geändert, das es nicht zu Übersteuerungen bei der Addition kommen kann.
Das Ergebnis ist aber immer noch nicht zufriedenstellend. Es klingt immer noch etwas statisch (höre Audio Beispiel unten).




Code:
// Phase increment for SupperSaw
    saw_inc32 += 6378593;

case WAVEFORM_SUPERSAW:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
            uint32_t ph_1 = phasedata[i];
            uint32_t ph_2 = ph_1 + (saw_inc32 * 1);
            uint32_t ph_3 = ph_1 + (saw_inc32 * 2);
            uint32_t ph_4 = ph_1 + (saw_inc32 * 3);
            uint32_t ph_5 = ph_1 + (saw_inc32 * 4);
            int16_t val_1 = signed_multiply_32x16t(magnitude * 0.40f, ph_1);
            int16_t val_2 = signed_multiply_32x16t(magnitude * 0.15f, ph_2);
            int16_t val_3 = signed_multiply_32x16t(magnitude * 0.15f, ph_3);
            int16_t val_4 = signed_multiply_32x16t(magnitude * 0.15f, ph_4);
            int16_t val_5 = signed_multiply_32x16t(magnitude * 0.15F, ph_5);
            *bp++ = val_1 + val_2 + val_3 + val_4 + val_5;
        }
        break;

Audio Beispiel

1. Supersaw mit kleinen Spread Wert (saw_inc32)
2. Supersaw mit mittleren Spread Wert (saw_inc32)
3. Supersaw mit großem Spread Wert (saw_inc32)
4. Osc1+2 Supersaw mit mittleren Spread Wert. Leichtes Osc detune und Jeannie Effekt Chorus2
 

Anhänge

  • SuperSaw 1.mp3
    840,9 KB
  • SuperSaw 2.mp3
    602,5 KB
  • SuperSaw 3.mp3
    400,7 KB
  • SuperSaw 4.mp3
    2,2 MB
Zuletzt bearbeitet:
uint32_t ph_2 = ph_1 + (saw_inc32 * 1);
uint32_t ph_3 = ph_1 + (saw_inc32 * 2);
uint32_t ph_4 = ph_1 + (saw_inc32 * 3);
uint32_t ph_5 = ph_1 + (saw_inc32 * 4);

Versuch mal keine geradzahligen (schon gar nicht vielfache), sondern "krumme" Faktoren (1.31, 2.693 oder sowas....). In deinem Beispiel "treffen" sich die Wellen beim kleinsten gemeinsamen Vielfachen (bzw. Teiler) 12 und bilden dann die hörbaren Minima und Maxima.


.... es sei denn es ist so beabsichtigt (?)
 
Versuch mal keine geradzahligen (schon gar nicht vielfache), sondern "krumme" Faktoren (1.31, 2.693 oder sowas....). In deinem Beispiel "treffen" sich die Wellen beim kleinsten gemeinsamen Vielfachen (bzw. Teiler) 12 und bilden dann die hörbaren Minima und Maxima.


.... es sei denn es ist so beabsichtigt (?)

Klingt gleich. Ich denke das hat damit zu tun, dass im Buffer (AUDIO_BLOCK_SAMPLES) nicht alle Phasenwerte für den Oszillator enthalten sind, sondern immer nur 128 Phasen Samples (44.1KHz Abtastrate). Der Rest wird erst nach der Leerung des Buffers berechnet 🤔
 
Zuletzt bearbeitet:
Du könntest versuchen an den (von der Tonhöhe) äußeren Rändern eine Impulswelle (schmaler Pulse) zu nehmen, enthält weniger vom Grundton und dafür mehr von den oberen Harmonischen (erzeugt aus dem Grund trotzdem Schwebung) und kann deswegen was leiser (probier mal so ca. 3-4dB weniger) gemacht werden und führt zu weniger Auslöschungen.
 
Habe heute meine Jeannie von 1.7x auf 1.99x geupdatet und muss sagen :
"Holla die Waldfee".

Wenn man an den Anfang zurück denkt ist richtig was passiert.
Soundmäßig macht Jeannie so schnell keiner was vor.
Sie richtig klingt schön lebendig.

Der neue HP filter hinter dem LPF ist genau das was noch gefehlt hat.
Wurde ja schon zu beginn darüber geredet, da schien es aufgrund der Rechenleistung nicht machbar....
Nun kann man den Boost der oft zuviel des guten ist auslassen und dann per Resonance des HP Filter gezielt den Bassanteil anheben.
Klasse.....

Hoffe das bei den Reglerbelegungen noch VCFenv Decay u. s. w hinzu kommen.
Schön wäre wenn Regler 1 und 2 immer Cut off und Reso wären aber sich zusätzlich verändern ließen.
Im Moment muss man jeden Patch neu anpassen.
Das ist etwas mühsam.

Bitte weiter machen, mir persönlich fehlt noch ein Mono/legato Modus aber das hab ich früher ja schon geschrieben.

Meinen Blofeld kann ich nun getrost einmodden der kommt Soundmäßig nicht mit der Jeannie mit.
Auch der Micromonsta 2 liegt meiner Meinung nach hinter der Jeannie zurück.

Danke Rolf und André für eure Arbeit und diesen tollen Synthie....
 
Zuletzt bearbeitet:
Kein Problem. Die Regler CUT und RES kann ich als Default Werte setzen.

Zur Zeit beschäftige ich mich noch mit der Supersaw. Muss doch möglich sein, aus der Jeannie diesen fetten Sound zu bekommen :pcsuxx:

Im Shruthi ging das über die Phasen incremets..

Shruthi code
C:
// ------- Quad saw (mit aliasing) -------------------------------------------
void Oscillator::RenderQuadSawPad(uint8_t* buffer) {
  uint16_t phase_spread = (
      static_cast<uint32_t>(phase_increment_.integral) * parameter_) >> 13;
  ++phase_spread;
  uint16_t phase_increment = phase_increment_.integral;
  uint16_t increments[3];
  for (uint8_t i = 0; i < 3; ++i) {
    phase_increment += phase_spread;
    increments[i] = phase_increment;
  }
 
  BEGIN_SAMPLE_LOOP
    UPDATE_PHASE
    data_.qs.phase[0] += increments[0];
    data_.qs.phase[1] += increments[1];
    data_.qs.phase[2] += increments[2];
    uint8_t value = (phase.integral >> 10);
    value += (data_.qs.phase[0] >> 10);
    value += (data_.qs.phase[1] >> 10);
    value += (data_.qs.phase[2] >> 10);
    *buffer++ = value;
  END_SAMPLE_LOOP
}

Jeannie Code
C:
// Phase increment for SupperSaw
    saw_inc32 += 678593;

case WAVEFORM_BANDLIMIT_SQUARE:
        for (i = 0 ; i < AUDIO_BLOCK_SAMPLES ; i++)
        {
            int32_t val = band_limit_waveform.generate_square (phasedata[i], i) ;
            *bp++ = (int16_t) ((val * magnitude) >> 16);
        }
        break;
   
        case WAVEFORM_SAWTOOTH:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
        *bp++ = signed_multiply_32x16t(magnitude, phasedata[i]);
        }
        break;

       
        case WAVEFORM_SUPERSAW:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
            uint32_t spread_2 = saw_inc32;
            uint32_t spread_3 = saw_inc32 + saw_inc32;
            uint32_t spread_4 = saw_inc32 + saw_inc32 + saw_inc32;
            uint32_t spread_5 = saw_inc32 + saw_inc32 + saw_inc32 + saw_inc32;
            uint32_t ph_1 = phasedata[i];
            uint32_t ph_2 = (ph_1 + spread_2);
            uint32_t ph_3 = (ph_1 + spread_3);
            uint32_t ph_4 = (ph_1 + spread_4);
            uint32_t ph_5 = (ph_1 + spread_5);
            int16_t val_1 = signed_multiply_32x16t(magnitude * 0.40f, ph_1);
            int16_t val_2 = signed_multiply_32x16t(magnitude * 0.15f, ph_2);
            int16_t val_3 = signed_multiply_32x16t(magnitude * 0.15f, ph_3);
            int16_t val_4 = signed_multiply_32x16t(magnitude * 0.15f, ph_4);
            int16_t val_5 = signed_multiply_32x16t(magnitude * 0.15F, ph_5);
            *bp++ = val_1 + val_2 + val_3 + val_4 + val_5;
        }
        break;
       

        case WAVEFORM_SAWTOOTH_REVERSE:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
            *bp++ = signed_multiply_32x16t(0xFFFFFFFFu - magnitude, phasedata[i]);
        }
        break;

        case WAVEFORM_BANDLIMIT_SAWTOOTH:
        case WAVEFORM_BANDLIMIT_SAWTOOTH_REVERSE:
        for (i = 0 ; i < AUDIO_BLOCK_SAMPLES ; i++)
        {
            int16_t val = band_limit_waveform.generate_sawtooth (phasedata[i], i) ;
            val = (int16_t) ((val * magnitude) >> 16) ;
            *bp++ = tone_type == WAVEFORM_BANDLIMIT_SAWTOOTH_REVERSE ? (int16_t) -val : (int16_t) +val ;
        }
        break;

        case WAVEFORM_TRIANGLE_VARIABLE:
        if (shapedata) {
            for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
                uint32_t width = (shapedata->data[i] + 0x8000) & 0xFFFF;
                uint32_t rise = 0xFFFFFFFF / width;
                uint32_t fall = 0xFFFFFFFF / (0xFFFF - width);
                uint32_t halfwidth = width << 15;
                uint32_t n;
                ph = phasedata[i];
                if (ph < halfwidth) {
                    n = (ph >> 16) * rise;
                    *bp++ = ((n >> 16) * magnitude) >> 16;
                    } else if (ph < 0xFFFFFFFF - halfwidth) {
                    n = 0x7FFFFFFF - (((ph - halfwidth) >> 16) * fall);
                    *bp++ = (((int32_t)n >> 16) * magnitude) >> 16;
                    } else {
                    n = ((ph + halfwidth) >> 16) * rise + 0x80000000;
                    *bp++ = (((int32_t)n >> 16) * magnitude) >> 16;
                }
                ph += inc;
            }
            break;
        } // else fall through to orginary triangle without shape modulation

        case WAVEFORM_TRIANGLE:
 
Zuletzt bearbeitet:
Das sind immer noch ganzzahlige Vielfache: spread3 ist das doppelte von spread2, spread4 ist das dreifache usw.

Was hast du für ne Frequenzauflösung? Versuche "krumme" DeTune-Werte, dann sollte das klappen.

Bei mir wird bei Note F und voll aufgedrehten DeTune-Grad z.B. folgende DeTune-Werte für die 12 Oszilllatoren erzeugt:
Code:
Osc  DeTune    Frequenz
1       0           87,30706573
2       2851        87,37079054
3       -5702       87,17961609
4       11413       87,56216615
5       -17107      86,92469448
6       25678       87,88101375
7       -19957      86,86099201
8       19954       87,75307238
9       -25688      86,73289418
10      59866       88,6451751
11      -45631      86,2871334
12      108332      89,72847462
Wie oben schon geschrieben steckt bei der DeTune-Berechnung etwas Zufälligkeit (berechnet aus DeTune-Grad, Prozessorzeit und Primzahlen) drin, daher sind die jedesmal "anders krumm".
 
Zuletzt bearbeitet:
Habe heute meine Jeannie von 1.7x auf 1.99x geupdatet und muss sagen :
"Holla die Waldfee".

Danke Rolf und André für eure Arbeit und diesen tollen Synthie....
Ich hatte die letzten Jahre auch ein paar Synths probiert und wieder verkauft (Ich bin absoluter Hobby-Laie). Bei der Jeannie war sogar meine Frau erstaunt: „DER Sound kommt von dem Teil was Du zusammengelötet hast? Unglaublich…“.
Wirklich ein irres Gerät und auch von mir nochmal Danke für das genialste DIY-Projekt ever!
 
SuperSAW

Kling schon besser :tanz:

C:
case WAVEFORM_SAWTOOTH:
        for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
            
            // Phase increment for SupperSaw
            saw_inc32 += inc >> 8;
            
            uint32_t spread_2 = saw_inc32;
            uint32_t spread_3 = saw_inc32 + saw_inc32;
            uint32_t spread_4 = saw_inc32 + saw_inc32 + saw_inc32;
            uint32_t spread_5 = saw_inc32 + saw_inc32 + saw_inc32 + saw_inc32;
            uint32_t ph_1 = phasedata[i];
            uint32_t ph_2 = (ph_1 + spread_2) * 3.09f;
            uint32_t ph_3 = (ph_1 + spread_3) * 5.01f;
            uint32_t ph_4 = (ph_1 + spread_4) * 3.15f;
            uint32_t ph_5 = (ph_1 + spread_5) * 4.79f;
            int16_t val_1 = signed_multiply_32x16t(magnitude * 0.40f, ph_1);
            int16_t val_2 = signed_multiply_32x16t(magnitude * 0.15f, ph_2);
            int16_t val_3 = signed_multiply_32x16t(magnitude * 0.15f, ph_3);
            int16_t val_4 = signed_multiply_32x16t(magnitude * 0.15f, ph_4);
            int16_t val_5 = signed_multiply_32x16t(magnitude * 0.15F, ph_5);
            *bp++ = val_1 + val_2 + val_3 + val_4 + val_5;
        }
        break;

SuperSaw1: Osc1 wie im Code

SuperSaw5: Osc1+2 mit detune und Chorus
 

Anhänge

  • SuperSaw1.mp3
    330,6 KB
  • SuperSaw5.mp3
    1,4 MB
Teste grade Supersaw . Really fääät. Wird eingebaut.
Rolf und Ich haben grade noch etwas rumgetestet. Leider geht die Supersaw nur mit nicht bandlimitierten Wellen. Fantastisch im Bass und in den mittleren Höhen . Zu hoch wird aber dreckich.
Aber trotzdem , was für ein dicker sound.... Ist auch bald Weihnachten. Mit dem Bass könnt ihr dann den Weihnachtsmann umhauen .
 
Hallo Rolf und Andre.
v 1.97 had the fx section freezed out. v.199 is now everything working supersmooth again.
I have created a local ebay for my Jeannie, just for pickup...
Want to see if I find someone interested in it, then I will buy another one!
Tnks for the constant updates! I have modified a computertalk to sound very much like
a MicroFreak, just severl voices better :) :connect:


I think a capacitative key like that of the Microfreak in a plug'in design like the Roland Boutique, if someone wanted to add one or two octave keyboard, it would be really cool, maybe a little bit smaller??? Tchusssss!
 
Zuletzt bearbeitet:


News

Zurück
Oben