Problème de commande tempo sur projet Arpeggiator

Bonjour,
Je recherche un membre ayant réalisé le projet de Dmitry intitulé Arduino midi Arpéggiator
trouvé dans la rubrique audio sound du centre de projet Arduino .
j’ai terminé et testé l’ arpeggiator sur un Arduino nano et tout fonctionne , sauf la commande de variation du tempo que je n’arrive pas à diminuer .
Le potentiomètre connecté sur la broche A3 (indelay) ne réagit pas , j’ai une tempo trés rapide en permanence, il est bien connecté sur la carte , tous les autres potentiomètres réagissent bien
Sur compilation et chargement du programme , je n’ai aucune erreur d’affichée
Merci pour vos aides

quelques liens direct sur le projet dont vous parlez, le code, une description exacte de votre montage et composants etc… pourrait vous aider à obtenir plus de de réponses sans doute

Je n’arrive pas à télécharger en lien direct la code + schéma de montage avec la description
le plus simple pour moi c’est d’aller consulter sur la page des projets Arduino
Projet de Dmitry intitulé Arduino midi Arpéggiator trouvé dans la rubrique
Community > Project Hub >Catégories Audio Sound > Arduino Midi Arpeggiator

OK, je ne connais pas ce projet mais ça a l’air amusant en effet

voici le lien sur le projet et le lien vers le code mais il a aussi un autre code (version 1)

Le potentiomètre connecté sur la broche A3 (indelay) ne réagit pas , j’ai une tempo trés rapide en permanence, il est bien connecté sur la carte , tous les autres potentiomètres réagissent bien

Commencez par vérifier que le câblage et le matériel fonctionne. Chargez le code suivant dans votre Arduino et ouvrez la console à 115200 bauds et regardez ce qu’il s’affiche quand vous bougez le potentiomètre

void setup() {
  Serial.begin(115200);
}

void loop() {
  static int prev = -1;
  int v = analogRead(A3);
  if (abs(v - prev) >= 2) {
    Serial.println(v);
    prev = v;
  }
}

OK
Suite à chargement du code test de l’entrée A3 et sur ouverture de la console à 115200 bauds
j’ai une incrémentation numérique sur rotation complète du potentiomètre de 1 à 800

OK donc ça a l’air fonctionnel et dans son code (V1) on dirait qu’il attend bien une valeur entre 0 et 800

un chose à tester éventuellement c’est si vous avez un bruit entre vos ADC car il les lit l’un après l’autre sans temps prendre le temps de laisser se stabiliser la tension.
→ Changez le code de la fonction readPoties() pour mettre à la place

void readPoties() {
  volatile int baseNote, baseOctave, octaveShift, steps, indelay, order, mode;

  baseNote = analogRead(baseNotepin); baseNote = analogRead(baseNotepin);

  baseOctave = analogRead(baseOctavepin); baseOctave = analogRead(baseOctavepin);

  octaveShift = analogRead(octaveShiftpin); octaveShift = analogRead(octaveShiftpin);

  steps = analogRead(stepspin); steps = analogRead(stepspin);

  indelay = analogRead(indelaypin); indelay = analogRead(indelaypin);

  order = analogRead(orderpin); order = analogRead(orderpin);

  mode = analogRead(modepin); mode = analogRead(modepin);

  a.setupArp(baseNote, baseOctave, octaveShift, steps, indelay, order, mode);

  // In my setup the buttons are connected to pins 6..12
  for (unsigned i = 12; i > 5; i--)
    if (!(digitalRead(i))) {
      button_pressed = true;
      ButtonVal = 13 - i;
      return;
    }
}

la double lecture du résultat de l’ADC permet de donner le temps à a tension de se stabiliser (s’il y a une grande différence de tension entre 2 pins)

Merci pour les infos , je reprendrai les tests demain matin

Je viens de changer le code de la fonction readPoties et j’ai toujours le même problème
le potentiomètre de variation de tempo connecté sur A3 ne réagit pas

Mon projet réalisé dans un boitier décodeur TNT PhilipsArp

Il faudrait rajouter des print de debug pour voir ce qui est vraiment lu

essayez d’échanger électriquement le potentiomètre connecté sur a3 avec un autre validé.

avec un simple multimètre vous obtenez une variation ?

Comme je suis novice dans la programmation Arduino , pouvez-vous me décrire clairement
votre description
Merci pour votre compréhension

Pouvez-vous me décrire clairement votre description ?
Car le potentiomètre en A3 à été testé sur la console avec le programme test , elle affiche bien une variation de 0 à 800

Comment obtenir une variation avec un simple multimètre ?

Merci pour votre compréhension

avec un multimètre vous branchez le fil noir au GND et le fil rouge sur la sortie qui va en A3 et vous regardez la tension lue, elle devrait varier entre 0 et 3.9V à la louche si tout va bien (mais le test effectué auparavant semble indiquer que pris isolément cette lecture se passe bien)

un test simple à faire pour verifier l’AD sur A3
sur le nano
deconnecter le curseur du potentiometre qui arrive sur A3 et connecter A3 au 3.3v

Bonjour J-M-L
Est il possible de votre coté , si vous le voulez-bien , de réaliser le test avec le schéma
suivant sur 1 seul bouton et le potentiomètre de tempo connecté seulement en A3

Arppégiator

#include <TimerOne.h>
#include "engine.h"
arp a(C, 5, 2, 6, 200, c_harmonic, 0);
bool button_pressed;
int ButtonVal;

#define baseNotepin 1
#define baseOctavepin 5
#define octaveShiftpin 0
#define stepspin 4
#define indelaypin 3
#define orderpin 7
#define modepin 6
#define syncinpin 3

#define LEDPin 13

// Synchronization: choose one of two possible options:
#define INT_SYNC
//#define EXT_SYNC

void readPoties()
{
  unsigned i;
  a.setupArp(analogRead(baseNotepin), analogRead(baseOctavepin), analogRead(octaveShiftpin), analogRead(stepspin), analogRead(indelaypin), analogRead(orderpin), analogRead(modepin));
  
  // In my setup the buttons are connected to pins 6..12
  for (i=12;i>5;i--)
    if (!(digitalRead(i))) { button_pressed = true; ButtonVal = 13-i; return; }
}

void setup()
{
  a.midibegin();
  Timer1.initialize(200000);          // initialize timer1, and set a 1/10 second period
  Timer1.attachInterrupt(readPoties); // We will read potis and buttons values within timer interrupt
  
  // LED pin
  pinMode(LEDPin, OUTPUT);
  
  // Initialize pins for 2-pins pushbuttons with pullup enabled
  for (unsigned i=6;i<13;i++)
  {
    pinMode(i,INPUT_PULLUP);
    //pinMode(i, INPUT);
    //digitalWrite(i, 1);
  }
  button_pressed = false;
  ButtonVal = 1;
}

void loop()
{
    if (button_pressed)
    {
      a.setProgression(ButtonVal-1);
      button_pressed = false;
      
      // Switch on LED
      digitalWrite(LEDPin, HIGH);
      a.play();
      
      // Switch off LED
      digitalWrite(LEDPin, LOW);
    }
}




Engine.cpp


#include "engine.h"
MIDI_CREATE_DEFAULT_INSTANCE();

// C Ionian     { C maj;  D min;  E min;  F maj;  G maj;  A min;  B dim  }
const chord ionian[7]     = {{0, maj},    {2, minor}, {4, minor}, {5, maj},   {7, maj},   {9, minor}, {11, dim}};

// C Dorian     { C min;  D min;  D♯ maj; F maj;  G min;  A dim;  A♯ maj  }
const chord dorian[7]     = {{0, minor},  {2, minor}, {3, maj},   {5, maj},   {7, minor}, {9, dim},   {10, maj}};

//C Phrygian    { C min;  C♯ maj; D♯ maj; F min;  G dim;  G♯ maj; A♯ min  }
const chord phrygian[7]   = {{0, minor},  {1, maj},   {3, maj},   {5, minor}, {7, dim},   {8, maj},   {10, minor}};

//C Lydian      { C maj;  D maj;  E min;  F♯ dim; G maj;  A min;  B min   }
const chord lydian[7]     = {{0, maj},    {2, maj},   {4, minor}, {6, dim},   {7, maj},   {9, minor}, {11, minor}};

//C Mixolydian  { C maj;  D min;  E dim;  F maj;  G min;  A min;  A♯ maj  }
const chord mixolydian[7] = {{0, maj},    {2, minor}, {4, dim},   {5, maj},   {7, minor}, {9, minor}, {10, maj}};

//C Aeolian     { C min;  D dim;  D♯ maj; F min;  G min;  G♯ maj; A♯ maj  }
const chord aeolian[7]    = {{0, minor},  {2, dim},   {3, maj},   {5, minor}, {7, minor}, {8, maj},   {10, maj}};

//C harmonic    { C min;  D dim;  D♯ aug; F min;  G maj;  G♯ maj; B dim   }
const chord harmonic[7]   = {{0, minor},  {2, dim},   {3, aug},   {5, minor}, {7, maj},   {8, maj},   {11, dim}}; 

//C Locrian     { C dim;  C♯ maj; D♯ min; F min;  F♯ maj; G♯ maj; A♯ min  }
const chord locrian[7]    = {{0, dim},    {1, maj},   {3, minor}, {5, minor}, {6, maj},   {8, maj},   {10, minor}};

const chord *all_chords[8] = {ionian, dorian, phrygian, lydian, mixolydian, aeolian, harmonic, locrian};

// Arrange the N elements of ARRAY in random order.  
void shuffle(int *array, size_t n)
{
    if (n > 1) 
    {
        size_t i;
        for (i = 0; i < n - 1; i++) 
        {
          size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
          int t = array[j];
          array[j] = array[i];
          array[i] = t;
        }
    }
}

void arp::setupArp(short bn, short bo, short os, unsigned short st, unsigned int d, int m, unsigned imode)
{
  baseNote = (notes) map(bn, 0, 800, 0, 11);
  baseOctave = (short) map(bo, 0, 800, 0, 7);
  octaveShift = (short) map(os, 0, 800, 0, 7);
  steps = (unsigned short) map(st, 0, 800, 1, 6);
  indelay = (unsigned int) map(d, 0, 800, 0, 500);
  mode = all_chords[(unsigned int) map(imode, 0, 800, 0, 8)];
  order = (unsigned int) map(m, 0, 800, 0, 4);
}

int arp::setProgression(unsigned int p)
{
    if (p<8)
    {
        progression = p;
        return 0;
    }
    else
        return -1;
}

int* createChord(notes root, chord_types i, int *notes_array, unsigned short *sh1, unsigned short *sh2)
{
    *sh1=0; *sh2=0;
    int s1, s2;
    switch (i) {
        case maj:   s1 = 4; s2 = 7; break;
        case minor: s1 = 3; s2 = 7; break;
        case dim:   s1 = 3; s2 = 6; break;
        case aug:   s1 = 4; s2 = 8; break;
    }
    notes_array[0] = root;
    notes_array[1] = (root+s1)%12;
    if (root+s1>11) *sh1=1; // octave shift
    notes_array[2] = (root+s2)%12;
    if (root+s2>11) *sh2=1; // octave shift
}

short midiByNote (notes note, short octave)
{
    if ((octave < -1)||(octave > 8))
        return -1;

    return (octave+1)*12 + (int)note;
}

void arp::play()
{
    int i;
    short n, shift, oct_shift=0, bn;
    unsigned short sh1, sh2, notes_added=0;
    notes curNote[3];
    short notestoplay[15] = {0,0,0,0,0,0,0,0,0,0};
    // Play base note
    if ((int)baseNote + (int)mode[progression].Shift > 11)
        baseOctave++;
    i = (baseNote + mode[progression].Shift)%12;
    bn = midiByNote ((notes)i, baseOctave);
    memset(notestoplay, sizeof(notestoplay), 0);
    
    // Create chord (notes root, intervals i, int *notes_array)
    createChord((notes)i, mode[progression].chord_type, (int*)curNote, &sh1, &sh2);

    // Create the progression
    if ((order == 0)||(order==2)||(order==3))
      for (i=0; i<steps; i++)
      {
          shift = i%3;
          oct_shift = i/3;
          if (shift == 1)
              oct_shift+=sh1;
          if (shift == 2)
              oct_shift+=sh2;
          notestoplay[notes_added] = midiByNote (curNote[shift], octaveShift+oct_shift);
          notes_added++;
      }
    if ((order == 1)||(order==2)||(order==2))
      for (i=steps-1; i>=0; i--)
      {
          shift = i%3;
          oct_shift = i/3;
          if (shift == 1)
              oct_shift+=sh1;
          if (shift == 2)
              oct_shift+=sh2;
          notestoplay[notes_added] = midiByNote (curNote[shift], octaveShift+oct_shift);
          notes_added++;
      }

    if (order==3)
      shuffle(notestoplay, notes_added);
    //Serial.print(bn); Serial.print("\r\n");
    MIDI.sendNoteOn(bn, 127, 1);
    for (i=0; i<notes_added; i++)
    {
        //Serial.print(notestoplay[i]); Serial.print("\r\n");
        MIDI.sendNoteOn(notestoplay[i], 127, 1);

        #ifdef INT_SYNC
        // Delay value from poti
        delay(indelay);
        #endif

        #ifdef EXT_SYNC
        // Wait for click from sync in
        while ((digitalRead(syncinpin) == 0));
        delay(65);
        #endif
        // Stop note
        MIDI.sendNoteOff(notestoplay[i], 0, 1);     // Stop the note
    }

    //Stop base note
    MIDI.sendNoteOff(bn, 0, 1);
}

arp::arp(notes bn, short bo, short os, unsigned short st, unsigned int d, unsigned m, unsigned int p) : baseNote(bn), baseOctave(bo), octaveShift(os), steps(st), indelay(d), progression(p)
{
  order = 0;
  mode = all_chords[m];
}

arp::arp()
{
    int i;
    baseNote = D;
    baseOctave = 5;
    octaveShift = -2;
    steps = 6;
    indelay = 200;
    progression = 0;
    mode = ionian;
}
 void arp::midibegin()
 {
   MIDI.begin(4);                      // Launch MIDI
   //Serial.begin(57600);
 }



Engine.h

#include <MIDI.h>
typedef enum {C, CD, D, DD, E, F, FD, G, GD, A, AD, B} notes;
typedef enum {maj, minor, dim, aug} chord_types;

#define c_ionian      0
#define c_dorian      1
#define c_phrygian    2
#define c_lydian      3
#define c_mixolydian  4
#define c_aeolian     5
#define c_harmonic    6
#define c_locrian     7

typedef struct {
    short Shift;
    chord_types chord_type;
} chord;

class arp {
private:
    notes baseNote;
    short baseOctave;

    short octaveShift;
    unsigned short steps;
    //unsigned int mode[6];
    unsigned int indelay;
    unsigned int progression;
    chord *mode;
    int order;
public:
    arp();
    arp(notes bn, short bo, short os, unsigned short st, unsigned int d, unsigned m, unsigned int p);
    void setupArp(short bn, short bo, short os, unsigned short st, unsigned int d, int m, unsigned imode);
    int setProgression(unsigned int p);
    void play();
    void midibegin();
};

int* createChord(notes root, chord_types i, int *notes_array, unsigned short *sh1, unsigned short *sh2);
short midiByNote (notes note, short octave);


En espérant finaliser ce projet qui pourra par la suite en faire profiter les amateurs de MAO
avec Arduino , Je vous remercie d’avance pour votre aide .

Je suis sur mon iPhone, je ne peux pas tester mais Passez les deux variables suivantes en volatile

volatile bool button_pressed;
volatile int ButtonVal;

L’appel et la modification de variables dans l’instance arp a est aussi sujette à caution car les variables ne sont pas volatile non plus.

Je suis Débutant en Arguino et je ne sais pas à quoi correspond les variables en volatile
j’ai rajouter dans le croquis volatil sur bool button_pressed et sur int ButtonVal
et je n’ai pas de changement sur la variation du tempo .
Dmitry à l’origine de ce projet ne ma toujours pas répondu sur ce problème .

Faites un test avec cette ligne

a.setupArp(analogRead(baseNotepin), analogRead(baseOctavepin), analogRead(octaveShiftpin), analogRead(stepspin), analogRead(A3), analogRead(orderpin), analogRead(modepin));

Je viens de faire le test avec cette ligne et j’ai toujours le même problème