Самодельные электронные ударные

Тема в разделе "Arduino & Shields", создана пользователем Dan, 24 дек 2016.

  1. Последнее редактирование: 11 сен 2018
  2. parovoZZ

    parovoZZ Гуру

    это не минус, а не грамотный выбор инструментария для решения конкретной задачи =)
     
  3. Может Я не правильно выразил свои мысли но-Идея в том , что добавить две цифровые кнопки при их нажатии уходил миди сигнал c кодом соответствующей ноте.
     
  4. parovoZZ

    parovoZZ Гуру

    Да, хорошая идея. Предлагаю поставить на голосование. Кто ЗА?
     
    Иосиф Виссарионович и Mitrandir нравится это.
  5. Mitrandir

    Mitrandir Гуру

    Если вы так подберете резисторы что сумма сопротивлений любых двух не равна любому другому то сможете различать какие кнопки нажаты одновременно
     
  6. Spone

    Spone Нерд

    Гораздо практичнее педаль хэта сделать через потенциометр(а ещё лучше через фоторезистор), а бочку так же как и остальные пэды - через пьезы. Всё будет более унифицировано, проще собирать и регулировать. Если нужно скину скетч с потенциометром на хай хэт, если совсем ничего не понятно будет, добавлю в него комментарии
     
    Иосиф Виссарионович нравится это.
  7. Бочка на кнопке для меня более функциональна. 1.Не нужно лепить ещё один пэд. 2.Нет необходимости в полноценной педали с колотушкой.
     
    Последнее редактирование: 14 сен 2018
  8. Уважаемые господа программисты помогите прикрутить к данному скетчу кнопку. Нужно подключить кнопку к цифровому входу , чтобы при нажатии уходил миди сигнал c кодом 36 .Зараннее благодарен!
     

    Вложения:

    Последнее редактирование: 14 сен 2018
  9. Скинь пожалуйста ! Лучше сразу с пояснениями
     
  10. ну что получилось или нет?
     
  11. Spone

    Spone Нерд

    Сегодня навряли получится, на крайняк - завтра
     
  12. Spone

    Spone Нерд

    Вот) то, где нет пояснений, лучше не трогать
    Код (Text):

    //задаём количество пэдов
    #define NUM_PIEZOS 9
    //задаём чуствительность
    #define SNARE_THRESHOLD 10  
    #define TOM1_THRESHOLD 18
    #define TOM2_THRESHOLD 18
    #define TOM3_THRESHOLD 18
    #define LCYM_THRESHOLD 18
    #define RCYM_THRESHOLD 18
    #define RIDE_THRESHOLD 18
    #define KICK_THRESHOLD 18
    #define HIHAT_THRESHOLD 10

    #define START_SLOT 0  

    //задаём ноты
    #define SNARE_NOTE 38
    #define TOM1_NOTE 71
    #define TOM2_NOTE 69
    #define TOM3_NOTE 67
    #define LCYM_NOTE 77
    #define RCYM_NOTE 79
    #define RIDE_NOTE 60
    #define KICK_NOTE 36
    #define HIHAT_NOTE 57

    #define NOTE_ON_CMD 0x90
    #define NOTE_OFF_CMD 0x80
    #define MAX_MIDI_VELOCITY 127

    #define SIGNAL_BUFFER_SIZE 100
    #define PEAK_BUFFER_SIZE 30
    #define MAX_TIME_BETWEEN_PEAKS 20
    #define MIN_TIME_BETWEEN_NOTES 50

    unsigned short slotMap[NUM_PIEZOS];
    unsigned short noteMap[NUM_PIEZOS];
    unsigned short thresholdMap[NUM_PIEZOS];
    short currentSignalIndex[NUM_PIEZOS];
    short currentPeakIndex[NUM_PIEZOS];
    unsigned short signalBuffer[NUM_PIEZOS][SIGNAL_BUFFER_SIZE];
    unsigned short peakBuffer[NUM_PIEZOS][PEAK_BUFFER_SIZE];

    boolean noteReady[NUM_PIEZOS];
    unsigned short noteReadyVelocity[NUM_PIEZOS];
    boolean isLastPeakZeroed[NUM_PIEZOS];

    unsigned long lastPeakTime[NUM_PIEZOS];
    unsigned long lastNoteTime[NUM_PIEZOS];

    int sensorPin = A12; //назначаем ногу потенциометра
    int sensorValue = 0;
    int midivalue = 0;
    int lastValue = 0;


    void setup()
    {
      Serial.begin(115200);
      for (short i = 0; i < NUM_PIEZOS; ++i)
      {
        currentSignalIndex[i] = 0;
        currentPeakIndex[i] = 0;
        memset(signalBuffer[i], 0, sizeof(signalBuffer[i]));
        memset(peakBuffer[i], 0, sizeof(peakBuffer[i]));
        noteReady[i] = false;
        noteReadyVelocity[i] = 0;
        isLastPeakZeroed[i] = true;
        lastPeakTime[i] = 0;
        lastNoteTime[i] = 0;
        slotMap[i] = START_SLOT + i;
      }
    //присваиваем каждой ноге чуствительность(см.4-12 строчки)
      thresholdMap[0] = SNARE_THRESHOLD;
      thresholdMap[1] = TOM1_THRESHOLD;
      thresholdMap[2] = TOM2_THRESHOLD;
      thresholdMap[3] = TOM3_THRESHOLD;
      thresholdMap[4] = LCYM_THRESHOLD;
      thresholdMap[5] = RCYM_THRESHOLD;
      thresholdMap[6] = RIDE_THRESHOLD;
      thresholdMap[7] = KICK_THRESHOLD;
      thresholdMap[8] = HIHAT_THRESHOLD;
    //присваиваем каждой ноге ноты(см.17-25 строчки)
      noteMap[0] = SNARE_NOTE;
      noteMap[1] = TOM1_NOTE;
      noteMap[2] = TOM2_NOTE;
      noteMap[3] = TOM3_NOTE;
      noteMap[4] = LCYM_NOTE;
      noteMap[5] = RCYM_NOTE;
      noteMap[6] = RIDE_NOTE;
      noteMap[7] = KICK_NOTE;
      noteMap[8] = HIHAT_NOTE;
     pinMode(sensorPin,INPUT);//назначаем ногу потенциометра как вход
    }

    void loop()
    {
    while(1)//не обязательно, но с "while" работает быстрее
    {
      sensorValue = analogRead(sensorPin);   //читаем значение с потенциометра
      midivalue = sensorValue/8; //приводим к виду "от 0 до 127"
      if (midivalue != lastValue) {
        sendMIDI(0xB9, 21, midivalue); //посылаем МИДИ-сигнал педали
        lastValue = midivalue;
      }
      delay(3); //задержка. Не обязательна, но может работать лучше
      unsigned long currentTime = millis();

      for (short i = 0; i < NUM_PIEZOS; ++i)
      {
        unsigned short newSignal = analogRead(slotMap[i]);
        signalBuffer[i][currentSignalIndex[i]] = newSignal;
        if (newSignal < thresholdMap[i])
        {
          if (!isLastPeakZeroed[i] && (currentTime - lastPeakTime[i]) > MAX_TIME_BETWEEN_PEAKS)
          {
            recordNewPeak(i, 0);
          }
          else
          {
            short prevSignalIndex = currentSignalIndex[i] - 1;
            if (prevSignalIndex < 0) prevSignalIndex = SIGNAL_BUFFER_SIZE - 1;
            unsigned short prevSignal = signalBuffer[i][prevSignalIndex];

            unsigned short newPeak = 0;
            while (prevSignal >= thresholdMap[i])
            {
              if (signalBuffer[i][prevSignalIndex] > newPeak)
              {
                newPeak = signalBuffer[i][prevSignalIndex];
              }
              prevSignalIndex--;
              if (prevSignalIndex < 0) prevSignalIndex = SIGNAL_BUFFER_SIZE - 1;
              prevSignal = signalBuffer[i][prevSignalIndex];
            }

            if (newPeak > 0)
            {
              recordNewPeak(i, newPeak);
            }
          }

        }

        currentSignalIndex[i]++;
        if (currentSignalIndex[i] == SIGNAL_BUFFER_SIZE) currentSignalIndex[i] = 0;
      }
    }
    }
    void sendMIDI(int cmd, int data1, int data2) {
      Serial.write(cmd);
      Serial.write(data1);
      Serial.write(data2);
    }

    void recordNewPeak(short slot, short newPeak)
    {
      isLastPeakZeroed[slot] = (newPeak == 0);

      unsigned long currentTime = millis();
      lastPeakTime[slot] = currentTime;
      peakBuffer[slot][currentPeakIndex[slot]] = newPeak;

      short prevPeakIndex = currentPeakIndex[slot] - 1;
      if (prevPeakIndex < 0) prevPeakIndex = PEAK_BUFFER_SIZE - 1;
      unsigned short prevPeak = peakBuffer[slot][prevPeakIndex];

      if (newPeak > prevPeak && (currentTime - lastNoteTime[slot]) > MIN_TIME_BETWEEN_NOTES)
      {
        noteReady[slot] = true;
        if (newPeak > noteReadyVelocity[slot])
          noteReadyVelocity[slot] = newPeak;
      }
      else if (newPeak < prevPeak && noteReady[slot])
      {
        if (slot != 5)
          noteFire(noteMap[slot], noteReadyVelocity[slot]);
        else
          noteFire(noteMap[slot], 90);
        noteReady[slot] = false;
        noteReadyVelocity[slot] = 0;
        lastNoteTime[slot] = currentTime;
      }

      currentPeakIndex[slot]++;
      if (currentPeakIndex[slot] == PEAK_BUFFER_SIZE) currentPeakIndex[slot] = 0;
    }

    void noteFire(unsigned short note, unsigned short velocity)
    {
      if (velocity > MAX_MIDI_VELOCITY)
        velocity = MAX_MIDI_VELOCITY;

      midiNoteOn(note, velocity);
      midiNoteOff(note, velocity);
    }


    void midiNoteOn(byte note, byte midiVelocity)
    {
      Serial.write(NOTE_ON_CMD);
      Serial.write(note);
      Serial.write(midiVelocity);
    }

    void midiNoteOff(byte note, byte midiVelocity)
    {
      Serial.write(NOTE_OFF_CMD);
      Serial.write(note);
      Serial.write(midiVelocity);
    }




     
     
    Иосиф Виссарионович нравится это.
  13. Спасибо
     
  14. Девайс microDrum от Массимо Бернава+шилд wav trigger wig 13660.Прошу поделится опытом если кто то делал нечто подобное!
     

    Вложения:

  15. Begemoth

    Begemoth Нуб

    Здравствуйте! С помощью вашего скетча и подсказкам товарища vinichenko.dl сделал себе барабанную установку, с глушилками, всё работает отлично! Спасибо вам огромное!! Но при записи в сенквенсоре заметил что ноты очень "длинные" хоть на слух и звучат правильно. А это очень усложняет процесс последующего их редактирования ... И потом вспомнил что вы писали о том что отключили ноте_офф и подумал что наверное в этом и есть проблема! Не могли бы вы подсказать что нужно дописать/добавить - а то я пока в программировании ноль((.. Заранее спасибо большое!!!! ))