Séquenceur à "mémoire de mouvements"

Salut !

Pour des besoins musicaux, j'aurais aimé me fabriquer une sorte de... hum, je n'ai pas les mots exacts, mais une sorte de séquenceur de mouvements.

Par exemple, sur chaque entrée analogique il y a un potar, donc 6 potar.
Dans un laps de temps X, par exemple sur 8 pas, le "jeu" des potentiomètres sera enregistré à la volée et retranscrits à la séquence suivante comme si je les modulais encore sauf que c'est la séquence enregistrée qui joue... hum, est-ce clair ? :~

Un peu à la manière de l'Electribe MX (ou peut-être les autres, mais je n'avais que celle-là).

Bref, le fait est que je ne sais pas trop par où commencer et je ne vois pas trop comment faire pour enregistrer une séquence de mouvement et je doute que l'Atmega328 ai assez de mémoire pour enregistrer les 6 valeurs...

Et bien pour ce qui est de la longueur de l'enregistrement, je pensais à intégrer une sélection du nombre de pas qui seront calés sur un tempo externe.
Le nombre de pas irait de 1 à 8 et le tempo se ferait via une entrée clock.

Je pense que pour simplifier la chose, l'enregistrement ne serait pas permanent. Pour enregistrer il faudra presser un bouton qui s'éteindra automatiquement à la fin de la séquence (de 1 à 8 pas donc) ou sur 2ème pression sur le bouton.

Pour ce qui est de la résolution, c'est bien le nombre de fois ou la variable "positionEnregistree" (par exemple) sera lue entre chaque pas ? Pour une résolution de 8 par exemple, la variable de position ne sera lue que sur chaque pas, tandis qu'une résolution de 16 fera appel à la fonction sur chaque pas + entre chaque pas, c'est bien ça ? J'ai bien compris ? :slight_smile:

Nombre de canaux = combien de servos à commander à la fois. (par ex 8 servos pour 8 mouvements indépendants).

Fréquence d'échantillonnage = tous les combien de temps il faut remettre à jour les positions (par exemple 25 par seconde pour du dessin animé).

Nombre de pas = Sur combien de niveaux on échantillonne un mouvement (par exemple 180 pas), si on veut au degré près sur un demi tour.

C'est le produit des trois qui te donne le flux d'infos à mémoriser par seconde.

La mémoire peut être augmentée avec une carte SD par ex.

Hello,

C'est un "step sequencer" que tu veux ?
As-tu déjà regardé si ces exemples vont dans le sens de tes besoins ?

https://learn.sparkfun.com/tutorials/build-an-auduino-step-sequencer/beautiful-music

Un step sequencer a un nombre de pas fixes, contrairement à ce que souhaites, mais c'est un premier pas vers tes besoins.

Alors non, ce n'est pas exactement un step sequencer, pour ça pas de problème et même pas besoin d'Arduino :slight_smile:

De plus, ce ne sont pas des servos que je souhaite commander mais des tensions de contrôle (sur 5, 8 ou 10V, je ne me suis pas encore décidé) pour pouvoir contrôler mon synthé modulaire.

Ce que je voudrais rendre, c'est pouvoir enregistrer une modulation de tension (valeurs donc) et faire en sorte qu'elle tourne toute seule ensuite.
Par exemple, lorsque j'appuie sur le bouton "rec" en début de séquence de 4 pas par exemple, l'enregistrement va se faire sur ces 4 pas et va s'éteindre à la fin de la séquence.
Lors de la lecture/enregistrement de cette séquence, je module le potentiomètre, modulations qui seront enregistrées en mémoire pour être retranscrites sur les séquences suivantes.

C'est un peu plus clair maintenant ? :~

Donc déjà si j'ai bien pigé, pour ce qui est de l'enregistrement des modulations, il faut une variable de chaque modulation, celle-ci serait un tableau de taille en rapport avec la résolution voulue, on va dire 256, c'est bien ça ?

Lors de l'enregistrement, les valeurs lues sur l'entrée analogique seront envoyées à ce tableau et la position de chaque valeur dépendra de l'avancement de lecture/enregistrement.

Je ne me trompe pas pour le moment ?

Après pour ce qui est de la lecture, il ne me reste plus qu'à envoyer les valeurs contenues dans les tableaux vers une sortie PWM.

Je suis sur la bonne piste ? :slight_smile:

Ok je vois oui, dans ce cas au lieu de déclencher l'enregistrement par un bouton, je pourrais très bien le faire dès qu'un évènement, en l'occurrence une modulation de bouton, intervient ?

Genre :

if (analogRead(0) != variableEnMémoire)
{
/// boucle d'enregistrement de modulation
}

C'est bien ça ?

Attention, l'Arduino n'a pas de sortie analogique!
Ca va te poser problème si c'est pour piloter des VCA.VCO ou filtres d'un synthé.

Il y a bien une astuce qui permet en gros d'avoir une sortie analogique à partie d'une sortie PWM à condition que l'entrée soit à haute impédance mais je doute que ça puisse être applicable à ton besoin.

Si tu veux commander ça vaudrait mieux des convertisseurs numérique->analogique sur I2C en sortie par exemple.

Ah je n'avais pas pensé à ça... C'est vrai que le PWM sont des impulsions plus ou moins rapides... J'avais essayé d'amplifier un signal PWM avec un transistor un jour pensant faire une sorte de VCO sin ou tri mais ça n'avais pas fonctionné, c'est peut-être à cause de ça ?

Bref, donc oui du coup... je n'ai jamais utilisé de convertisseur numérique > analogique et je n'ai donc aucune idée de comment ça fonctionne :frowning:

Outch, ça sort de mes connaissances actuelles... c'est comme ça qu'on apprends, seulement je dois avouer que je n'ai jamais rien compris à l'impédance. Plusieurs mois que j'essaye de piger et rien à faire :~

RoKN:
Ah je n'avais pas pensé à ça... C'est vrai que le PWM sont des impulsions plus ou moins rapides... J'avais essayé d'amplifier un signal PWM avec un transistor un jour pensant faire une sorte de VCO sin ou tri mais ça n'avais pas fonctionné, c'est peut-être à cause de ça ?

Bref, donc oui du coup... je n'ai jamais utilisé de convertisseur numérique > analogique et je n'ai donc aucune idée de comment ça fonctionne :frowning:

Pour toi le plus simple serait d'utiliser ça: MCP4725 Breakout Board - 12-Bit DAC with I2C Interface [STEMMA QT / qwiic] : ID 935 : Adafruit Industries, Unique & fun DIY electronics and kits
Il t'en faut un par canal.
L.'avantage par rapport au filtrage RC d.une sortie pwm c'est que tu contrôles parfaitement la tension de sortie.

Oui d'accord, j'aurais souhaité ne pas passer par des cartes préfaites, j'aime bien tout faire par moi-même (je préfère dans la mesure du possible me servir d'un AtMega328 standalone plutôt qu'une carte Uno), mais soit... je rajoute ça sur la liste du matériel , merci beaucoup :slight_smile:

Par contre pour ce qui est du câblage, si je veux faire 6 sorties (pour 6 entrées), il me faut donc 6 MCP4725 Breakout Board, ok.
Le SDL et SDL seront branchés en série ?

Qu'en est-il au niveau code ?

RoKN:
Oui d'accord, j'aurais souhaité ne pas passer par des cartes préfaites, j'aime bien tout faire par moi-même (je préfère dans la mesure du possible me servir d'un AtMega328 standalone plutôt qu'une carte Uno), mais soit... je rajoute ça sur la liste du matériel , merci beaucoup :slight_smile:

Par contre pour ce qui est du câblage, si je veux faire 6 sorties (pour 6 entrées), il me faut donc 6 MCP4725 Breakout Board, ok.
Le SDL et SDL seront branchés en série ?

Qu'en est-il au niveau code ?

Tu ne peux chaîner que 2 de ces cartes mais il doit en exister d'autres avec plus de lignes d'adresse accessibles.
Je te laisse regarder les exemples de codes fournis sur la page indiquée.... :wink:
Les sda et scl sont branchées en parallèle. La broche a0 détermine l'adresse i2c

Oui d'accord, merci beaucoup :slight_smile:
J'ai encore pas mal de trucs à voir alors, moi qui pensait ça plus simple...