Pro micro в качестве USB-MIDI

poison064
Offline
Зарегистрирован: 30.03.2017

Доброго времени суток!

Необходимо Arduino Pro micro задействовать в качестве USB-MIDI контроллера.

Т.е. что бы устройство при подключении к ПК падало в раздел Звуковое оборудование и автоматом ставились драйвера, короче говоря, полноценный plug and play.

Устройсвто будет с минимумом кнопок и потенциометров, что бы не лепить дополнительный обвес, т.е. требуется использовать только пины на платке ардуино.

В данном случае контроллер требуется для управления софтом на ПК, например amplytube, guitar rig и пр.

Как оказалось, написание скетча для меня - это просто темный лес. 

Единственное что смог осилить, это найти несколько библиотек MIDI и прошить один из готовых примеров, что бы заставить платку определиться как Plug and Play и она стала доступна как МИДИ контроллер в вышеперечисленных программах.

Может кто то уже делал шаги в этом направлении на данной платке?

Приму любую помощь!

 

PS использоват вот этот готовый пример:

#include <MIDI.h>

#if defined(USBCON)
#include <midi_UsbTransport.h>

static const unsigned sUsbTransportBufferSize = 16;
typedef midi::UsbTransport<sUsbTransportBufferSize> UsbTransport;

UsbTransport sUsbTransport;

MIDI_CREATE_INSTANCE(UsbTransport, sUsbTransport, MIDI);

#else // No USB available, fallback to Serial
MIDI_CREATE_DEFAULT_INSTANCE();
#endif

// --

void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity)
{
    Serial.print("NoteOn  ");
    Serial.print(inNumber);
    Serial.print("\tvelocity: ");
    Serial.println(inVelocity);
}
void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity)
{
    Serial.print("NoteOff ");
    Serial.print(inNumber);
    Serial.print("\tvelocity: ");
    Serial.println(inVelocity);
}

void setup() {
    Serial.begin(115200);
    while (!Serial);
    MIDI.begin();
    MIDI.setHandleNoteOn(handleNoteOn);
    MIDI.setHandleNoteOff(handleNoteOff);
    Serial.println("Arduino ready.");
}

void loop() {
    MIDI.read();
}

 

poison064
Offline
Зарегистрирован: 30.03.2017

Реализация через HID джойстик мне не понравилась, доп софт, виртуальные порты... Это все не то.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

poison064 пишет:

Это все не то.

«Нимфа», туды её в качель, разве товар дает?!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

под 64-x виндой все драйвера платные, долларов 400-800 в год, кто оплатит банкет?

poison064
Offline
Зарегистрирован: 30.03.2017

ua6em пишет:

под 64-x виндой все драйвера платные, долларов 400-800 в год, кто оплатит банкет?

Поподробнее., совсем ничего не понял.

poison064
Offline
Зарегистрирован: 30.03.2017

Нашел рабочий скетч, осталось подправить под себя.

/*
   This examples shows how to make a simple seven keys MIDI keyboard with volume control

   Created: 4/10/2015
   Author: Arturo Guadalupi <a.guadalupi@arduino.cc>
   
   http://www.arduino.cc/en/Tutorial/MidiDevice
*/

#include "MIDIUSB.h"
#include "PitchToNote.h"
#define NUM_BUTTONS  7

const uint8_t button1 = 2;
const uint8_t button2 = 3;
const uint8_t button3 = 4;
const uint8_t button4 = 5;
const uint8_t button5 = 6;
const uint8_t button6 = 7;
const uint8_t button7 = 8;

const int intensityPot = 0;  //A0 input

const uint8_t buttons[NUM_BUTTONS] = {button1, button2, button3, button4, button5, button6, button7};
const byte notePitches[NUM_BUTTONS] = {C3, D3, E3, F3, G3, A3, B3};

uint8_t notesTime[NUM_BUTTONS];
uint8_t pressedButtons = 0x00;
uint8_t previousButtons = 0x00;
uint8_t intensity;

void setup() {
  for (int i = 0; i < NUM_BUTTONS; i++)
    pinMode(buttons[i], INPUT_PULLUP);
}


void loop() {
  readButtons();
  readIntensity();
  playNotes();
}

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

void readButtons()
{
  for (int i = 0; i < NUM_BUTTONS; i++)
  {
    if (digitalRead(buttons[i]) == LOW)
    {
      bitWrite(pressedButtons, i, 1);
      delay(50);
    }
    else
      bitWrite(pressedButtons, i, 0);
  }
}

void readIntensity()
{
  int val = analogRead(intensityPot);
  intensity = (uint8_t) (map(val, 0, 1023, 0, 127));
}

void playNotes()
{
  for (int i = 0; i < NUM_BUTTONS; i++)
  {
    if (bitRead(pressedButtons, i) != bitRead(previousButtons, i))
    {
      if (bitRead(pressedButtons, i))
      {
        bitWrite(previousButtons, i , 1);
        noteOn(0, notePitches[i], intensity);
        MidiUSB.flush();
      }
      else
      {
        bitWrite(previousButtons, i , 0);
        noteOff(0, notePitches[i], 0);
        MidiUSB.flush();
      }
    }
  }
}

// First parameter is the event type (0x09 = note on, 0x08 = note off).
// Second parameter is note-on/note-off, combined with the channel.
// Channel can be anything between 0-15. Typically reported to the user as 1-16.
// Third parameter is the note number (48 = middle C).
// Fourth parameter is the velocity (64 = normal, 127 = fastest).

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

poison064 пишет:

ua6em пишет:

под 64-x виндой все драйвера платные, долларов 400-800 в год, кто оплатит банкет?

Поподробнее., совсем ничего не понял.

А так?

poison064
Offline
Зарегистрирован: 30.03.2017

ua6em пишет:

poison064 пишет:

ua6em пишет:

под 64-x виндой все драйвера платные, долларов 400-800 в год, кто оплатит банкет?

Поподробнее., совсем ничего не понял.

А так?

 

И на кой лад мне эта информация? Прошил ардуинку скетчем, представленным выше, устройство корректно определяется и работает на WIN764, WIN10 64.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Я правильно понимаю что всё что нужно это AT32U4, то есть pro micro или leonardo, и система спросит обычный драйвер на leonardo? И устройство появится, скажем в списке MIDI-источников, в той же Cubase/FL? А то тоже serialmidi и loopback драйвер не доставляют... Midi на UNO или Mega2560 - тот ещё квест.

poison064
Offline
Зарегистрирован: 30.03.2017

Все верно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Если устраивает название arduino то проблем нет, проблема если я хочу назвать это устройство своим именем

poison064
Offline
Зарегистрирован: 30.03.2017

ua6em пишет:

Если устраивает название arduino то проблем нет, проблема если я хочу назвать это устройство своим именем

 

Прекращайте флудить пожалуйста в моей теме, мне как и многим другим совершенно неважно с каким именем определяется устройство. Главное что плата выполняет возложенные на нее "обязанности".

Если нет идей по данному направлению и желания\возможности помочь новичку, зачем писать посты не относящиеся к вопросу озвученному вначале?

proymer
Offline
Зарегистрирован: 16.03.2018

Так ты разобрался как написать програмку для управления Guitar Rig? Если да, можешь поделиться?

poison064
Offline
Зарегистрирован: 30.03.2017

proymer пишет:

Обращайся ко мне напрямую: compbase@list.ru, тут эту тему поднимать бессмысленно.

proymer
Offline
Зарегистрирован: 16.03.2018

Да я вроде как уже разобрался :)