Использование Teensy 3.5 (Arduino) для одновременной генерации USB и аппаратных MIDI-сообщений.

В настоящее время пытаюсь заставить крошечный 3.5-дюймовый компьютер спамить серию заметок в цикле через USB и аппаратный последовательный порт, и я почти уверен, что он с этим справится.

У меня есть схема MIDI, настроенная в соответствии со спецификациями, приведенными здесь: https://www.pjrc.com/teensy/td_libs_MIDI.html И в настоящее время он воспроизводит циклическую группировку нот через массив, встроенный в Ableton через 5-контактную схему DIN, подключенную к универсальному преобразователю MIDI 5-контактный DIN -> USB.

 #include <MIDI.h>

#define HWSerial Serial1
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
const int channel = 1;

void setup() {

  HWSerial.begin(9600);
  MIDI.begin();
}

void loop() {
  int note;
  for (note=10; note <= 127; note++) {
    MIDI.sendNoteOn(note, 100, channel);
    delay(200);
    MIDI.sendNoteOff(note, 100, channel);
  }
  delay(2000);
}

Я склонен полагать, что при работе с последовательным выходом USB на Teensy вы просто называете порт «Serial», а для других — «Serial1», «Serial2» и т. д.

Я пробовал использовать последовательный порт вместо аргументов в MIDI_CREATE_INSTANCE и также пробовал использовать MIDI_CREATE_DEFAULT_INSTANCE, который должен выполнить эту настройку на последовательном порте по умолчанию, которым, как я предполагаю, является USB? (Это отлично сработало на моей настройке Arduino Mega, где я использовал чип 16u2 в качестве преобразователя последовательного порта в USB-MIDI в соответствии с этим методом: https://github.com/ddiakopoulos/hiduino)

Я просто немного озадачен, так как мне удалось скомпилировать код с использованием экземпляра по умолчанию, и он отображается как MIDI-устройство в диспетчере устройств Windows, а также в Ableton, когда я устанавливаю Тип USB: Последовательный + MIDI в раскрывающемся списке инструментов Arduinos, но не выводит никаких нот :(

Может ли кто-нибудь помочь мне заставить это работать?

Сейчас я играю с:

    #include <MIDI.h>

const int channel = 1;

void setup() 
{

}

void loop() 
{
  int note;
  for (note=20; note <= 63; note++) // Диапазон был изменен с 10:127 для сохранения барабанных перепонок.
  {
    usbMIDI.sendNoteOn(note, 100, channel);
    delay(200);
    usbMIDI.sendNoteOff(note, 100, channel);
  }
  delay(2000);
}

но получить

    C:\Users\Jamie\AppData\Local\Temp\arduino_build_144363/..\arduino_cache_283435\core\core_teensy_avr_teensy35_usb_serialmidi,speed_120,opt_o2std,keys_en-us_4939f5412a75a8560acb0f9e98268f02.a(pins_teensy.c.o): In function `_init_Teensyduino_internal_':

C:\Program Files (x86)\Arduino\hardware\teensy\avr\cores\teensy3/pins_teensy.c:582: undefined reference to `analog_init'

collect2.exe: error: ld returned 1 exit status

Error compiling for board Teensy 3.5.

а если я попробую включить 'usbMIDI', то получу

F:\GigaTech\MMMM_Beta_Code\debug\TeensyUSBMIDILoopTest\TeensyUSBMIDILoopTest.ino:1:21: fatal error: usbMIDI.h: No such file or directory

compilation terminated.

Error compiling for board Teensy 3.5.

хотя midiUSB определенно установлен :S


-----------------------------ПРОДОЛЖЕНИЕ ----------------------------

Итак, теперь у меня есть рабочий скетч для USB и аппаратной MIDI-связи, но я не могу заставить их работать одновременно. Мой код для оборудования показан выше, а метод USB — ниже:

 #include <MIDI.h>

MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
const int channel = 1;

void setup() {
  MIDI.begin();
}

void loop() {
  int note;
  for (note=10; note <= 127; note++) 
  {
    usbMIDI.sendNoteOn(note, 100, channel);
    delay(200);
    usbMIDI.sendNoteOff(note, 100, channel);
  }
  delay(2000);
}

Я предполагал, что можно сделать что-то вроде этого:

 #include <MIDI.h>

#define HWSerial Serial1
MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI); // 5-контактный выход DIN
const int channel = 1;

void setup() 
{  
  HWSerial.begin(9600);
  MIDI.begin();  
}

void loop() {
  int note;
  for (note=20; note <= 63; note++) // Диапазон был изменен с 10:127 для сохранения барабанных перепонок.
  {
    usbMIDI.sendNoteOn(note, 100, channel);
    MIDI.sendNoteOn(note, 100, channel);
    delay(200);
    usbMIDI.sendNoteOff(note, 100, channel);
    MIDI.sendNoteOff(note, 100, channel);
  }
  delay(2000);
}

Но, похоже, это не работает. Код прекрасно компилируется и загружается, однако Ableton видит только MIDI-сообщения, поступающие через маленький USB-порт, а не через мой MIDI-приемник. Я задавался вопросом, связано ли это с тем, что оба они подключены к моему ПК через USB-порт, но это, конечно, не должно быть проблемой. Я также пробовал назначать USB и аппаратные MIDI-отправки на разные каналы, но безрезультатно.

Мне бы очень хотелось, чтобы они оба работали одновременно.

, 👍0


2 ответа


1

Просто используйте usbMidi.

#include <MIDI.h>

MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
const int channel = 1;

void setup() {
  MIDI.begin();
}

void loop() {
  int note;
  for (note=10; note <= 127; note++) {
    MIDI.sendNoteOn(note, 100, channel);
    usbMIDI.sendNoteOn(note, 100, channel);
    delay(200);
    MIDI.sendNoteOff(note, 100, channel);
    usbMIDI.sendNoteOff(note, 100, channel);
  }
  delay(2000);
}
,

0

Так что мне удалось заставить оба работать одновременно!

Похоже, для MIDI teensy через USB не требуется объявление экземпляра MIDI, и в моем коде была небольшая ошибка. Указанное объявление функции должно быть «Serial1», а не «Serial».

Рабочий код ниже! :)

#include <MIDI.h>

#define HWSerial Serial1
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI); // 5-контактный выход DIN
const int HWChannel = 2;
const int USBChannel = 1;

void setup() 
{  
  HWSerial.begin(9600);
  MIDI.begin();  
}

void loop() {
  int note;
  for (note=20; note <= 63; note++) // Диапазон был изменен с 10:127 для сохранения барабанных перепонок.
  {
    usbMIDI.sendNoteOn(note, 100, USBChannel);
    MIDI.sendNoteOn(note, 100, HWChannel);
    delay(200);
    usbMIDI.sendNoteOff(note, 100, USBChannel);
    MIDI.sendNoteOff(note, 100, HWChannel);
  }
  delay(2000);
}
,