Sammlung Teensy - Anfängerfragen

Wegen anderen SPI Pins für dein Display mal hier nachlesen..

Bei mir war es ähnlich wie dort im Thread vorgestellt. Ich wechselte dann auch zur u8g2Lib und das funktionierte dann. In der Einstellung "SW" benutzt der Treiber eine Software-Emulation und man kann alle Display-Pins auf frei wählen. Diese Variante ist aber deutlich weniger performant. In der HW-Einstellung kann man nur 3 Pins frei wählen - MOSI und SCK müssen zwingend 11 und 13 sein, um die Hardwarebeschleunigung zu nutzen. Die beiden Pins nutzt aber das Audioshield.


Mein Plan ist es nun auf die höheren Pins vom SDI1 (26 und 27) auszuweichen. Dafür gibt es in der u8g2 auch einen zweiten Treiber "2ND":
Code:
U8G2_SSD1327_WS_128X128_F_2ND_4W_HW_SPI u8g2(...);
Aber irgendwie funktioniert das nicht. Es ist dazu auch nichts weiter dokumentiert.

Der normale Aufruf für die Standardverkablung:
Code:
U8G2_SSD1327_WS_128X128_F_4W_HW_SPI u8g2(...);
funktioniert mit den Pins 11 und 13.


In möchte in jedem Fall die Hardwarebeschleunigung einsetzen, weil der Synth damit fehlerfrei läuft.
Allerdings dann ohne Audioshield, wegen des Pin-Konfliktes.
 
In möchte in jedem Fall die Hardwarebeschleunigung einsetzen, weil der Synth damit fehlerfrei läuft.
Allerdings dann ohne Audioshield, wegen des Pin-Konfliktes.

Ich habe gerade festgestellt, dass das ja läuft. Irgendwie hatte ich nur hypothetisch angenommen, dass es da ein Problem gibt, aber es funktioniert. Mit Audioshield und Hardware-Beschleunigung für das Display. Heureka! Das ist ein guter Tag. :phones:
 
Ja, Hartnäckigkeit zahlt sich aus. Wenn die SPI per Software gelaufen wundert micht nichts. Wobei die Software-Implementierung dann ja auch in irgend einem Interrupt gelaufen sein muss. Egal, Hauptsache es geht.

In der HW-Einstellung kann man nur 3 Pins frei wählen - MOSI und SCK müssen zwingend 11 und 13 sein, um die Hardwarebeschleunigung zu nutzen. Die beiden Pins nutzt aber das Audioshield.
MOSI,MISO,SCK und SDCS sind auf dem Audio-Shield mit dem SD Slot verbunden. Solange Du also die SD-Karte des Shields nicht benutzt musst Du Dir erstmal keine Gedanken machen. Normalerweise sind auf jedem SPI Interface auch mehrere Slaves möglich. Dafür gibt es die "CS" Signale. Je der Slaves bekommt ein eigenes CS-Signal zugewiesen und der Teensy kann dann über das Signal den Slave auswählen mit dem er kommunizieren möchte. Allerdings sind SD-Karten etwas speziell. Ob die zusammen mit anderen am selben SPI funktionieren hab ich jetzt nicht im Kopf.

Wenn Du das zweite SPI Interface benutzen willst, dann must du auch einen anderen, passenden CS Pin wählen und im Konstruktur U8G2_SSD1327_WS_128X128_F_2ND_4W_HW_SPI verwenden. Wenn ich es richtig sehe, dann ist SPI1 mit MOSI1,SCLK1 und CS1-0 auf den Pins 26,27 und 0:

 
Tip: Auf dem Audio-Shiel Rev. D/D2 ist Pin 11+13 für die SD Karte und den optionale Speicher-Chip notwendig. Wenn diese nicht benutzt werden, dann sind die Pins frei fürs Display.
 
Auf dem Teensy 4.1 gibt es ja einen SD-Karten-Slot, den ich dann auch (ganz später) nutzen würde, um Presets abzuspeichern. Durch das Audioshield ist das etwas doppelt-gemoppelt. Ich habe noch einen Teensy 4.0 da - die kürzere Fassung ohne SD-Slot. Da macht die Erweiterung auf dem Audioshield schon Sinn. Müsste man dann halt nur zum Laufen bekommen mit dem Dipslay.

@rolfdegen Du nutzt doch einen Teensy + Display. Ist das ein SPI-Display. Wie hast Du denn das gelöst?


Soweit funktioniert das aber erstmal und ich bin die Timing-Probleme los, was viel Wert ist. Heute habe ich im nächsten Schritt die lose Parameter-Sammlung für die Audio-Module in die Encoder-Map übertragen. Darin speichere ich - analog zu den Pages/Menüs - für alle Parameter den Encoderwert (0-127). Die Abspielroutine holt sich die Werte dann direkt aus der Map und jetzt bin ich diese Parametersprünge auch los. Das optimiere ich aber nochmal, um die CPU-Last möglichst gering zu halten.

Die Modulationen in meinem Synth sind recht schräg, was ich aber angestrebt habe. "justanother 3 Osc Monosynth" braucht glaube kein Mensch. Der Waldorf Pulse schlachtet das Thema aus, der Minimog hat es begonnen. Der Arp2600 ist auch mega. Da bekommt auch experimentelle Sachen raus. Mein kleiner Synth soll eher eine "digitale Kratzbürste" für Techno und Electro sein. Im Video hört man das ja schon in Ansätzen: FM, digital Combining, Wavefolder, Bitcrusher.

Irgendwann habe ich gemerkt, dass man ja auch ein Konzept braucht für seinen Synth. :polizei:
Bisher ist da sehr viel improvisiert, aber beim nächsten Projekt weiß ich es besser.
 
Zuletzt bearbeitet:
@rolfdegen Du nutzt doch einen Teensy + Display. Ist das ein SPI-Display. Wie hast Du denn das gelöst?

Ich benutze einen Teensy 4.1 mit mehr Port-Leitungen und ein anderes Audio-Shield (PCM5102).
Das Display hat einen SPI Anschluss und wird mit 32Mhz Clockrate betrieben.
Weil die Leitungen vom Teensy Borad bis zum Display auf unserer Platine sehr kurz sind, funktioniert das Display sogar bis 59MHz.
Zum Laden und speichern von Patches benutze ich den SD Kartenslot auf dem Teensy4.1 Board.

Schematic.png
 
Zuletzt bearbeitet:
Mein Synth nimmt langsam Form an - auch natürlich dank Eurer Hilfe!
Hier gibt es ein neues Demovideo vom aktuellen SUPRABUZZ:




Ich benutze einen Teensy 4.1 mit mehr Port-Leitungen und ein anderes Audio-Shield (PCM5102).
Das Display hat einen SPI Anschluss und wird mit 32Mhz Clockrate betrieben.
Weil die Leitungen vom Teensy Borad bis zum Display auf unserer Platine sehr kurz sind, funktioniert das Display sogar bis 59MHz.
Zum Laden und speichern von Patches benutze ich den SD Kartenslot auf dem Teensy4.1 Board.

Anhang anzeigen 201704

Danke für den Input!
Zum Testen habe ich mir auch mal ein PCM5102 bestellt, weil die Beschreibung recht überzeugend klang. Beim aktuellen Synth wechsle ich das nicht mehr, aber es wäre vielleicht eine Idee für meine Teensy 4.0, den ich für ein anderes Projekt nutzen möchte. Hast Du für das PCM5102 eine eigene Lib oder funktioniert die mit den Boardmitteln? In der Audiolib GUI war das Audioshield nicht dabei.


Als nächstes möchte ich noch versuchen Patches auf der SD-Karte zu speichern.
Und generell wird auch der Teil spannend das Gerät auf eine feste Platine zu übertragen und ein Gehäuse zu finden. :denk:
 
Respekt, wer's selber macht ;-)

Und generell wird auch der Teil spannend das Gerät auf eine feste Platine zu übertragen und ein Gehäuse zu finden.
Das ist fast die größte Herausforderung an solchen Projekten. Zumindest dann, wenn man einen höheren Anspruch an Ästhetik hat und (wie ich) 3D-Druck- oder Acrylglas-Gehäuse grottenhässlich findet.

Ich hab zwei, drei DIY-Projekte in der Pipeline, wo ich (sollte ich je damit fertig werden) auf die Kombi Universalgehäuse/Customized Panel setzen werde. Dieser Dienstleister erstellt dir Panels mit Bohrungen und Ausschnitten für relativ wenig Geld:


Die Bohrungen, Ausschnitte und Formen kannst du direkt auf der Website eingeben. Das probiere ich auf jeden Fall mal aus.

Was Platinen anbelangt, sind Breadboard-PCBs eine schnelle, einfache und günstige Lösung. Da kannst du deine Schaltung quasi 1:1 übertragen. Ist halt nicht so sexy wie eine "richtige" Platine:

https://www.amazon.de/dp/B07G5CHBTK
 
Zuletzt bearbeitet:
@klangsulfat
Danke für den Tipp! Da sind tolle Ideen dabei. Ob es die größte Herausforderung ist, weiß ich nicht, aber es ist definitiv auch Neuland, was ich da betrete. Mein Platinenlayout ist (noch) sehr übersichtlich und sollte nicht zu viele Probleme machen. Aber klar, ein Kabel kann man lustig im dreidimensionalen Raum verbinden - auf einer Platine reduziert sich das auf zwei Dimensionen.

Vor langer Zeit hatte ich mal einfache Gitarreneffekte auf Lochrasterplatinen aufgebaut. Da musste ich das schon einmal tun. Aus diesem Grund war es immer schon ein Traum einen eigenen Synthesizer zu entwickeln.


1705910633212.png

Heute habe ich das Projekt vom Teensy 4.1 erfolgreich auf eine "Teensy 4.0 Plattform" portiert.

Der Pin-Bereich ist beim Teensy 4.0 deutlich eingeschränkter, als beim Teensy 4.1. Ursprünglich war der Teensy 4.0 nur als Experimentierplattform gedacht. Das Sichern und Laden von Patches via JSON hat jetzt funktioniert, aber ich möchte ungern das Masterprojekt zerpflücken, um mit aller Macht die SD-Card einzubinden. Jetzt habe ich zwei Boards mit dem selben Stand und kann es - eines ist also immer Backup.

Mich reizt es allerdings schon das auf dem kleineren Teensy 4.0 mit Audioshield hinzubekommen. Ich habe extra die Pins für die SD nicht angefasst und versucht zwei "shared Pins" zu finden, die ich für einen Taster/Button nutzen kann. Auf Pin6 habe ich den MEMCS benutzt und Pin 21 BLCK mit AudioBitClock. Die Pins werden eigentlich vom Audioshiled benutzt, ab womöglich nicht in der aktuellen Konfiguration.

Die nächste Aufgabe wäre dann der SD-Kartenslot und die zuvor entwickelte Lösung zum Laden und Speichern von Patches.
 
Ich hab hier zwei Teensy 4.1 herumliegen, wobei einer fest für den MicroDexed Touch reserviert ist. Mich juckt es ja auch in den Fingern, was eigenes zu bauen. Aber ich trau mir das mit meinen zwar vorhandenen, aber doch eher oberflächlichen Programmierkenntnissen nicht so wirklich zu. Zumal es dann eher in Richtung Sampler gehen soll, und das ja noch einmal eine Ecke komplizierter ist, auch und gerade der zeitkritische Zugriff auf Sampledaten.

Gibt es für den Teensy "fertige" Sampler-Projekte, bei denen es sich lohnt, mal einen Blick draufzuwerfen? Also irgendwelche Soundfont-Player o. ä.

Das beeindruckendste Teensy-Projekt ist der Dirtywave M8. Ich glaube, da wird wirklich das maximal mögliche aus einem Teensy rausgeholt.
 
Ich hab hier zwei Teensy 4.1 herumliegen, wobei einer fest für den MicroDexed Touch reserviert ist. Mich juckt es ja auch in den Fingern, was eigenes zu bauen. Aber ich trau mir das mit meinen zwar vorhandenen, aber doch eher oberflächlichen Programmierkenntnissen nicht so wirklich zu. Zumal es dann eher in Richtung Sampler gehen soll, und das ja noch einmal eine Ecke komplizierter ist, auch und gerade der zeitkritische Zugriff auf Sampledaten.

Gibt es für den Teensy "fertige" Sampler-Projekte, bei denen es sich lohnt, mal einen Blick draufzuwerfen? Also irgendwelche Soundfont-Player o. ä.

Das beeindruckendste Teensy-Projekt ist der Dirtywave M8. Ich glaube, da wird wirklich das maximal mögliche aus einem Teensy rausgeholt.

Ich möchte einen Drumsynth entwickeln, der Hybrid Samples und Synth-Engine nutzt. Bisschen wie der Korg Drumlogue - oder eher der LXR-02 mit Samples oder etwas Richtung Microtonic als Hardware. Der SUPRABUZZ war ja erstmal ein Kennenlernprojekt.

Einen einfachen Sampler finde ich gar nicht so schwierig. Man müsste auf alle Fälle sehen, dass man die Samples von der SD/Memory streamt. Die direkt in den Code einzubinden halte ich da nicht für zielführend. Das mag bei dem Drumsynth gehen, aber nicht bei einem Sampler. Irgendwo gab es aber Beispielsprogramme für Samples, die das gemacht haben. Im einfachsten Fall hast Du 16 Samples und legst auf jeden MIDI-Kanal eins. Das spielst Du dann ohne Pitchkorrektur über MIDI ab. So, wie bei den Trackern damals. Das wäre so einfacher Player.

Schwieriger wirds dann, wenn Du Multilayer-Samples hast für unterschiedliche Tonhöhen/Lautstärken. Vielleicht gibt es da schon fertigen C++Code, der SFZ (Soundfont) lesen kann.
 
Am liebsten wäre mir sowas wie der Micromonsta 2 in Geschmacksrichtung Sampler: Bitimbral, SF2/SFZ-Import (also Multisamples), so 8 - 12 Stimmen, mit Filter, Modulation und guten Effekten. Nicht, dass ich sowas selbst entwickeln könnte/wollte, aber das wäre ein Projekt, das ich sofort nachbauen würde.

Für den Raspberry gibt es einen MT-32 Emulator, der auch Soundfonts abballern kann.

So, wie bei den Trackern damals.
Tracker konnten Samples schon immer chromatisch spielen, das war ja die eigentliche Innovation damals :)
 
Ein weiteres sehr interessantes Projekt. Aber hier fehlt mir das Hintergrundwissen, wie man die libraries aufspielt und entsprechend konfiguiert, aber ich werde die Entwicklung weiterhin mit großem Interesse beobachten.
 
Zu meiner Frage habe ich das hier gefunden: https://github.com/newdigate/teensy-polyphony

Das ist zwar kein fertiges Projekt, aber vielleicht kann man daraus lernen.

Ich habe mir nur kurz den Quellcode angeschaut. Ziehe es doch mal fix rüber auf den Teensy und probiere es.
Da sind ja keine Encoder usw. eingebunden und das sollte problemlos klappen.

Wie ich bereits erwähnt habe, sind hier aber die Samples (Piano) direkt in den Quellcode eingebunden: drei Samples, je Octave eines. Das ist dann eher ein ROM-Player, als ein reiner Sampler. In der Teensy-Bibliothek ist aber ein Beispiel dabei, bei dem die Samples von der SD-Card geladen werden. Es gibt auch einen ganz simple WAV-Player, der von SD-Card lädt.

Dazu ist keine große Entwicklungsarbeit nötigt.
 
Ein weiteres sehr interessantes Projekt. Aber hier fehlt mir das Hintergrundwissen, wie man die libraries aufspielt und entsprechend konfiguiert, aber ich werde die Entwicklung weiterhin mit großem Interesse beobachten.

Die Libraries kannst Du ganz einfach über deine IDE einbinden > Libraries > suchen und herunterladen.
Die werden dann automatisch dem Include-Befehl zugeordnet, sofern es natürlich die richtigen sind.

Wenn Du irgendwas händisch einbinden musst, kannst Du die *.h und *.cpp-Files in deinen Ordner kopieren und dann ebenfalls via include einbinden.
 
Danke für die Unterstützung.

"...einfach über deine IDE einbinden", "...ebenfalls via include einbinden."... 🤔.

Das Einlöten oder Zusammenstecken von Komponenten, sofern plausibel dargestellt, stellt kein Problem dar, aber sobald in den Bereichen Coden/Programmieren geht, wird es problematisch.

Sollte ich mich dazu durchringen, das Projekt anzugehen, melde ich mich bei Bedarf mit konkreten Fragestellungen.
 
Sollte ich mich dazu durchringen, das Projekt anzugehen, melde ich mich bei Bedarf mit konkreten Fragestellungen.

Ich habe mich heute Abend mal durch die Onlineshops dieser Welt durchgeklickt und alle notwendigen Komponenten bestellt. Es gibt ja leider immer den einen oder anderen Artikel der in einem Shop nicht verfügbar ist - Murphys Law... Das waren dann inkl. Versandkosten € 107,13, ohne ein passendes Case oder eine PCB.
 
Die Entwicklung am SUPRABUZZ geht stetig voran.

Nach vielem Herumprobieren mit den Datentypen, konnte ich heute den ersten Erfolg beim Sichern und Laden eines Patches verbuchen. Ist alles noch sehr rudimentär implementiert, aber funktioniert. Ich kämpfe noch mit Problemen bei der Konvertierung zwischen char* und const char* ... dazu muss ich mir echt nochmal ein Tutorial anschauen. Als Webprogrammiererin muss man sich erstmal mit dem Pointer-Konzept beschäftigen.

Ich habe versucht noch einen Pin für einen zusätzlichen Taster an den Teensy zu bekommen, aber das ist so nicht möglich. Entweder verlöte ich einen weiteren Pin an der Unterseite oder bekomme eine Art Shift-Funktion hin - sprich: wenn Button 1 + Button 2 gedrückt mache dies und jenes. Durch die Themen muss ich jetzt erstmal durchschlagen. Das wird nicht ausbleiben.

Beim nächsten Projekt kann ich die Infrastruktur dann weiter nutzen.


1706844517517.png
 
Für mehr Buttons kannst du entweder ein Shift Register (74HC165) nutzen oder die Taster in einer Dioden Matrix organisieren.
Die 74HC165 haben 8 Eingänge.
Wenn du mehr als 8 Buttons nutzen willst, lassen sich die 74HC165 auch kaskadieren.

Wenn du auch diverse Status LEDs einbauen willst, dann geht das mit dem 74HC595 der 8 Ausgänge bietet.
 
Zuletzt bearbeitet:
wenn Button 1 + Button 2 gedrückt mache dies und jenes
Ich hab (für Arduino) mir was einfallen lassen, wie man eine Reihenfolge von Tastendrücken auswerten kann:

Grundprinzip:
jeder Taster hat einen Buchstaben zugeordnet.
wenn ein Taster von LOW auf HIGH geht dann schreibe ich einen Großbuchstaben in eine Stringvariable
wenn der Taster von HIGH auf LOW geht dann schreibe ich einen Kleinbuchstaben in die Stringvariable
Dann enthält der String eine Buchstabenfolge die den Tastendrücken entspricht, die ich dann auswerten kann.

ZB
Play drücken und wieder loslassen = "Pp"
Play drücken und halten, Stop kurz drücken, Play wieder loslassen = "PSsp"
Play drücken und halten, Stop drücken und halten, Play wieder loslassen, Stop loslassen = "PSps"

Auf die Art kann man mit zwei Tastern quasi beliebige Infos kodieren.

Beispiel aus https://www.florian-anwander.de/clockboy/clockboy_1-21.ino. Z.B. Ein Factory-Reset ist STOP gedrückt halten und viermal Play drücken

Code:
[…]
/*Variables for the reading logic of inputs and buttons */
boolean startState = 0;
boolean stopState = 0;
boolean startStatePrev = 0;
boolean stopStatePrev = 0;
[…]
void setup {
  […]
}

void loop {
  /* Taster-pins lesen */
  startState = !digitalRead(startPin);
  stopState = !digitalRead(stopPin);

  […]
  /* Now we read the order of the button presses */
  /* Prepare the variables */
  if ((startStatePrev == 0 && stopStatePrev == 0) && (startState == 1 || stopState == 1))  {
    keyPressOrder = "";
    if (keyPressOrderLastIsSet == 1) {
      keyPressOrderLastIsSet = 0;
    }
  }
  /* Read button presses and fill the variable */
  if (startStatePrev == 0 && startState == 1) {
    keyPressOrder = keyPressOrder + "P";
    startStatePrev = 1;
  }
  if (startStatePrev == 1 && startState == 0) {
    keyPressOrder = keyPressOrder + "p";
    startStatePrev = 0;
  }
  if (stopStatePrev == 0 && stopState == 1) {
    keyPressOrder = keyPressOrder + "S";
    stopStatePrev = 1;
  }
  if (stopStatePrev == 1 && stopState == 0) {
    keyPressOrder = keyPressOrder + "s";
    stopStatePrev = 0;
  }
  /* make the variable readable */
  if (stopState == 0 && startState == 0 ) {
    if (keyPressOrderLastIsSet == 0) {
      keyPressOrderLast = keyPressOrder;
      keyPressOrderLastIsSet = 1;
    }
  }


  /* evaluating the order of button presses */

  /* Factory reset is in all modes possible: Hold STOP and Press PLAY four times */
  if (keyPressOrderLast == "SPpPpPpPps") {
    factoryreset();
    keyPressOrderLast = "";
  }

  /* set MIDI-Channel with CC#76: Hold PLAY and press STOP two times */
  if (keyPressOrderLast == "PSsSsp") {
  […]
}
 
Zuletzt bearbeitet:
char* und const char*
Uh, da musst Du im Embedded Bereich höllisch aufpassen was auf der rechten Seite steht.
C:
const char* abc   = "ABC";
char*       def   = "DEF";

char        ghi[] = "GHI";

  • abc ist vom Typ ein Zeiger auf einen Konstanten String. Der String wird dabei normalerweise im FLASH des Controller gespeichert, ist auch physikalisch Read-Only.
  • def ist nicht richtig. Denn es ist vom Typ ein Zeiger auf einen Variablen String, der aber auf einen String zeigt der ebenfalls im FLASH des Controllers abgelegt ist. (String Literale "" erzeugen immer eine Konstante)
  • ghi ist ein Array Of Char mit 4 Zeichen welches im RAM abliegt und mittels der Konstante "GHI" initialisiert wird. Es darf daher später verändert werden. Die Länge des arrays wird hier vom Compiler automatisch ermittelt, man könnte auch z.B. [10] statt [] schreiben, dann wären Speicher für max 9 Zeichen da. (Termininierung erfolgt durch 0)
Von der Verwendung her lassen sich abc,def,ghi alle gleich benutzten den bei C ist ein Array ohne Indizierungsoperator das gleiche wie ein Zeiger.


C:
assert(abc[1] == 'B');
assert( *(abc+1) == 'B');

assert(ghi[1] == 'H');
assert( *(ghi+1) == 'H');
assert( (ghi+1) == &(ghi[1]));

def = ghi;
assert(def[1] == 'H');
assert( *(def+1) == 'H');

def = &(ghi[0]);
assert(def[1] == 'H');
assert( *(def+1) == 'H');

def = ghi+1;
assert(def[1] == 'I');
assert( *(def+1) == 'I');

Man muss bei C/C++ (Arduino ist C++) ein bisl mit dem "&" Operator aufpassen. Bei Variablen-Deklarationen definiert man damit eine Referenz (Ein Pointer, der immer gültig ist und wie eine Variable benutzt wird) Wenn man es im Code schreibt, dann ist es der Adressoperator.
 
Für mehr Buttons kannst du entweder ein Shift Register (74HC165) nutzen oder die Taster in einer Dioden Matrix organisieren.
Die 74HC165 haben 8 Eingänge.
Wenn du mehr als 8 Buttons nutzen willst, lassen sich die 74HC165 auch kaskadieren.

Wenn du auch diverse Status LEDs einbauen willst, dann geht das mit dem 74HC595 der 8 Ausgänge bietet.

Ich gab ganz vergessen zu schreiben, daß du dafür nur 3 Digital Pins am uC brauchst.
Clock, Latch/Load und Data.
So kann man auf jeden Fall ohne Probleme massig Buttons, Encoder, LEDs, etc. realisieren, ohne daß gleich die I/Os ausgehen.
Beispiele dazu dürfte es genug im Netz geben.
Fertige Breakout Boards gibts auch von den verschiedensten Anbietern.

 


News

Zurück
Oben