MIDI Блок
MIDI Блок
Решил создать тему по миди блоку, так как поисковик по форуму не выдал результата. К сожалению в такой замечательной программе как FlProg нет такого блока, а для Arduino 2560 он очень нужен. Библиотека в вложении. Сейчас занялся его созданием , но есть некоторые трудности. Суть задачи такова: имеем вход музыкального инструмента. В библиотеку посылаем с входа значения note, sensitivity и flag=false.
Примерный вид:
[spoiler]
#include <MIDI.h>
struct MySettings : public midi::DefaultSettings
{
static const long BaudRate = 115200;
};
MIDI_CREATE_DEFAULT_INSTANCE);
const int velocity = 127; //Max Velocity (range is 0-127)
const int channel = 1; //MIDI Channel 1 (out of 16)
void setup() {
MIDI.begin();
}
// Play notes from F3 (53) to A6 (93):
void loop() {
// For each note from 53 to 93, perform the following code for that note,
// incrementing note by 1 each time.
for (int note = 53; note <= 93; note ++) {
MIDI.sendNoteOn(note, velocity, channel); // Turn the note on.
delay(1000); // Wait 1000 milliseconds.
MIDI.sendNoteOff(note, velocity, channel); // Turn the note off.
}
}
[/spoiler]
Как создать блок в FLProg, это понятно, понятно и что куда прописать, не могу разобраться как заставить команду MIDI.sendNoteOn передавать входящее значение с внешней переменной. К миди блоку хочется подвести хотя бы 2 входа типа integer.
Velocity - характеризует силу удара по клавише. Устройства, оснащенные датчиками скорости нажатия клавиши, измеряют скорость, с которой клавиша при нажатии опускается вниз, и присваивают значение в пределах от 0 до 127 параметру velocity, указывая, таким образом, скорость атаки.
note - передаваемый код ноты согласно миди карты нот
channel - номер миди канала на который передавать.
Так же приведу в листинге из библиотеки в вложении, поддерживаемый набор команд для миди библиотеки, которые так же хотелось бы использовать.
[spoiler]
/*!
* @file midi_Defs.h
* Project Arduino MIDI Library
* @brief MIDI Library for the Arduino - Definitions
* @author Francois Best
* @date 24/02/11
* @license MIT - Copyright (c) 2015 Francois Best
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once
#include "midi_Namespace.h"
#if ARDUINO
#include <Arduino.h>
#else
#include <inttypes.h>
typedef uint8_t byte;
#endif
BEGIN_MIDI_NAMESPACE
#define MIDI_LIBRARY_VERSION 0x040300
#define MIDI_LIBRARY_VERSION_MAJOR 4
#define MIDI_LIBRARY_VERSION_MINOR 3
#define MIDI_LIBRARY_VERSION_PATCH 0
// -----------------------------------------------------------------------------
#define MIDI_CHANNEL_OMNI 0
#define MIDI_CHANNEL_OFF 17 // and over
#define MIDI_PITCHBEND_MIN -8192
#define MIDI_PITCHBEND_MAX 8191
// -----------------------------------------------------------------------------
// Type definitions
typedef byte StatusByte;
typedef byte DataByte;
typedef byte Channel;
typedef byte FilterMode;
// -----------------------------------------------------------------------------
// В этой секции миди команды
/*! Enumeration of MIDI types */
enum MidiType
{
InvalidType = 0x00, ///< For notifying errors
NoteOff = 0x80, ///< Note Off
NoteOn = 0x90, ///< Note On
AfterTouchPoly = 0xA0, ///< Polyphonic AfterTouch
ControlChange = 0xB0, ///< Control Change / Channel Mode
ProgramChange = 0xC0, ///< Program Change
AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch
PitchBend = 0xE0, ///< Pitch Bend
SystemExclusive = 0xF0, ///< System Exclusive
TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame
SongPosition = 0xF2, ///< System Common - Song Position Pointer
SongSelect = 0xF3, ///< System Common - Song Select
TuneRequest = 0xF6, ///< System Common - Tune Request
Clock = 0xF8, ///< System Real Time - Timing Clock
Start = 0xFA, ///< System Real Time - Start
Continue = 0xFB, ///< System Real Time - Continue
Stop = 0xFC, ///< System Real Time - Stop
ActiveSensing = 0xFE, ///< System Real Time - Active Sensing
SystemReset = 0xFF, ///< System Real Time - System Reset
};
// -----------------------------------------------------------------------------
/*! Enumeration of Thru filter modes */
struct Thru
{
enum Mode
{
Off = 0, ///< Thru disabled (nothing passes through).
Full = 1, ///< Fully enabled Thru (every incoming message is sent back).
SameChannel = 2, ///< Only the messages on the Input Channel will be sent back.
DifferentChannel = 3, ///< All the messages but the ones on the Input Channel will be sent back.
};
};
/*! Deprecated: use Thru::Mode instead.
Will be removed in v5.0.
*/
enum __attribute__ ((deprecated)) MidiFilterMode
{
Off = Thru::Off,
Full = Thru::Full,
SameChannel = Thru::SameChannel,
DifferentChannel = Thru::DifferentChannel,
};
// -----------------------------------------------------------------------------
/*! \brief Enumeration of Control Change command numbers.
See the detailed controllers numbers & description here:
http://www.somascape.org/midi/tech/spec.html#ctrlnums
*/
enum MidiControlChangeNumber
{
// High resolution Continuous Controllers MSB (+32 for LSB) ----------------
BankSelect = 0,
ModulationWheel = 1,
BreathController = 2,
// CC3 undefined
FootController = 4,
PortamentoTime = 5,
DataEntryMSB = 6,
ChannelVolume = 7,
Balance = 8,
// CC9 undefined
Pan = 10,
ExpressionController = 11,
EffectControl1 = 12,
EffectControl2 = 13,
// CC14 undefined
// CC15 undefined
GeneralPurposeController1 = 16,
GeneralPurposeController2 = 17,
GeneralPurposeController3 = 18,
GeneralPurposeController4 = 19,
DataEntryLSB = 38,
// Switches ----------------------------------------------------------------
Sustain = 64,
Portamento = 65,
Sostenuto = 66,
SoftPedal = 67,
Legato = 68,
Hold = 69,
// Low resolution continuous controllers -----------------------------------
SoundController1 = 70, ///< Synth: Sound Variation FX: Exciter On/Off
SoundController2 = 71, ///< Synth: Harmonic Content FX: Compressor On/Off
SoundController3 = 72, ///< Synth: Release Time FX: Distortion On/Off
SoundController4 = 73, ///< Synth: Attack Time FX: EQ On/Off
SoundController5 = 74, ///< Synth: Brightness FX: Expander On/Off
SoundController6 = 75, ///< Synth: Decay Time FX: Reverb On/Off
SoundController7 = 76, ///< Synth: Vibrato Rate FX: Delay On/Off
SoundController8 = 77, ///< Synth: Vibrato Depth FX: Pitch Transpose On/Off
SoundController9 = 78, ///< Synth: Vibrato Delay FX: Flange/Chorus On/Off
SoundController10 = 79, ///< Synth: Undefined FX: Special Effects On/Off
GeneralPurposeController5 = 80,
GeneralPurposeController6 = 81,
GeneralPurposeController7 = 82,
GeneralPurposeController8 = 83,
PortamentoControl = 84,
// CC85 to CC90 undefined
Effects1 = 91, ///< Reverb send level
Effects2 = 92, ///< Tremolo depth
Effects3 = 93, ///< Chorus send level
Effects4 = 94, ///< Celeste depth
Effects5 = 95, ///< Phaser depth
DataIncrement = 96,
DataDecrement = 97,
NRPNLSB = 98, ///< Non-Registered Parameter Number (LSB)
NRPNMSB = 99, ///< Non-Registered Parameter Number (MSB)
RPNLSB = 100, ///< Registered Parameter Number (LSB)
RPNMSB = 101, ///< Registered Parameter Number (MSB)
// Channel Mode messages ---------------------------------------------------
AllSoundOff = 120,
ResetAllControllers = 121,
LocalControl = 122,
AllNotesOff = 123,
OmniModeOff = 124,
OmniModeOn = 125,
MonoModeOn = 126,
PolyModeOn = 127
};
struct RPN
{
enum RegisteredParameterNumbers
{
PitchBendSensitivity = 0x0000,
ChannelFineTuning = 0x0001,
ChannelCoarseTuning = 0x0002,
SelectTuningProgram = 0x0003,
SelectTuningBank = 0x0004,
ModulationDepthRange = 0x0005,
NullFunction = (0x7f << 7) + 0x7f,
};
};
// -----------------------------------------------------------------------------
/*! \brief Create an instance of the library attached to a serial port.
You can use HardwareSerial or SoftwareSerial for the serial port.
Example: MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi2);
Then call midi2.begin(), midi2.read() etc..
*/
#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) \
midi::MidiInterface<Type> Name((Type&)SerialPort);
#if defined(ARDUINO_SAM_DUE) || defined(USBCON)
// Leonardo, Due and other USB boards use Serial1 by default.
#define MIDI_CREATE_DEFAULT_INSTANCE() \
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
#else
/*! \brief Create an instance of the library with default name, serial port
and settings, for compatibility with sketches written with pre-v4.2 MIDI Lib,
or if you don't bother using custom names, serial port or settings.
*/
#define MIDI_CREATE_DEFAULT_INSTANCE() \
MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI);
#endif
/*! \brief Create an instance of the library attached to a serial port with
custom settings.
@see DefaultSettings
@see MIDI_CREATE_INSTANCE
*/
#define MIDI_CREATE_CUSTOM_INSTANCE(Type, SerialPort, Name, Settings) \
midi::MidiInterface<Type, Settings> Name((Type&)SerialPort);
END_MIDI_NAMESPACE
[/spoiler]
Плата Arduino 2560 умеет быть миди устройством, если переставить перемычку на ней. Тогда она даже в системе отображается как миди устройство. В этом режиме достаточно работать просто миди командами.
Примерный вид:
[spoiler]
#include <MIDI.h>
struct MySettings : public midi::DefaultSettings
{
static const long BaudRate = 115200;
};
MIDI_CREATE_DEFAULT_INSTANCE);
const int velocity = 127; //Max Velocity (range is 0-127)
const int channel = 1; //MIDI Channel 1 (out of 16)
void setup() {
MIDI.begin();
}
// Play notes from F3 (53) to A6 (93):
void loop() {
// For each note from 53 to 93, perform the following code for that note,
// incrementing note by 1 each time.
for (int note = 53; note <= 93; note ++) {
MIDI.sendNoteOn(note, velocity, channel); // Turn the note on.
delay(1000); // Wait 1000 milliseconds.
MIDI.sendNoteOff(note, velocity, channel); // Turn the note off.
}
}
[/spoiler]
Как создать блок в FLProg, это понятно, понятно и что куда прописать, не могу разобраться как заставить команду MIDI.sendNoteOn передавать входящее значение с внешней переменной. К миди блоку хочется подвести хотя бы 2 входа типа integer.
Velocity - характеризует силу удара по клавише. Устройства, оснащенные датчиками скорости нажатия клавиши, измеряют скорость, с которой клавиша при нажатии опускается вниз, и присваивают значение в пределах от 0 до 127 параметру velocity, указывая, таким образом, скорость атаки.
note - передаваемый код ноты согласно миди карты нот
channel - номер миди канала на который передавать.
Так же приведу в листинге из библиотеки в вложении, поддерживаемый набор команд для миди библиотеки, которые так же хотелось бы использовать.
[spoiler]
/*!
* @file midi_Defs.h
* Project Arduino MIDI Library
* @brief MIDI Library for the Arduino - Definitions
* @author Francois Best
* @date 24/02/11
* @license MIT - Copyright (c) 2015 Francois Best
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#pragma once
#include "midi_Namespace.h"
#if ARDUINO
#include <Arduino.h>
#else
#include <inttypes.h>
typedef uint8_t byte;
#endif
BEGIN_MIDI_NAMESPACE
#define MIDI_LIBRARY_VERSION 0x040300
#define MIDI_LIBRARY_VERSION_MAJOR 4
#define MIDI_LIBRARY_VERSION_MINOR 3
#define MIDI_LIBRARY_VERSION_PATCH 0
// -----------------------------------------------------------------------------
#define MIDI_CHANNEL_OMNI 0
#define MIDI_CHANNEL_OFF 17 // and over
#define MIDI_PITCHBEND_MIN -8192
#define MIDI_PITCHBEND_MAX 8191
// -----------------------------------------------------------------------------
// Type definitions
typedef byte StatusByte;
typedef byte DataByte;
typedef byte Channel;
typedef byte FilterMode;
// -----------------------------------------------------------------------------
// В этой секции миди команды
/*! Enumeration of MIDI types */
enum MidiType
{
InvalidType = 0x00, ///< For notifying errors
NoteOff = 0x80, ///< Note Off
NoteOn = 0x90, ///< Note On
AfterTouchPoly = 0xA0, ///< Polyphonic AfterTouch
ControlChange = 0xB0, ///< Control Change / Channel Mode
ProgramChange = 0xC0, ///< Program Change
AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch
PitchBend = 0xE0, ///< Pitch Bend
SystemExclusive = 0xF0, ///< System Exclusive
TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame
SongPosition = 0xF2, ///< System Common - Song Position Pointer
SongSelect = 0xF3, ///< System Common - Song Select
TuneRequest = 0xF6, ///< System Common - Tune Request
Clock = 0xF8, ///< System Real Time - Timing Clock
Start = 0xFA, ///< System Real Time - Start
Continue = 0xFB, ///< System Real Time - Continue
Stop = 0xFC, ///< System Real Time - Stop
ActiveSensing = 0xFE, ///< System Real Time - Active Sensing
SystemReset = 0xFF, ///< System Real Time - System Reset
};
// -----------------------------------------------------------------------------
/*! Enumeration of Thru filter modes */
struct Thru
{
enum Mode
{
Off = 0, ///< Thru disabled (nothing passes through).
Full = 1, ///< Fully enabled Thru (every incoming message is sent back).
SameChannel = 2, ///< Only the messages on the Input Channel will be sent back.
DifferentChannel = 3, ///< All the messages but the ones on the Input Channel will be sent back.
};
};
/*! Deprecated: use Thru::Mode instead.
Will be removed in v5.0.
*/
enum __attribute__ ((deprecated)) MidiFilterMode
{
Off = Thru::Off,
Full = Thru::Full,
SameChannel = Thru::SameChannel,
DifferentChannel = Thru::DifferentChannel,
};
// -----------------------------------------------------------------------------
/*! \brief Enumeration of Control Change command numbers.
See the detailed controllers numbers & description here:
http://www.somascape.org/midi/tech/spec.html#ctrlnums
*/
enum MidiControlChangeNumber
{
// High resolution Continuous Controllers MSB (+32 for LSB) ----------------
BankSelect = 0,
ModulationWheel = 1,
BreathController = 2,
// CC3 undefined
FootController = 4,
PortamentoTime = 5,
DataEntryMSB = 6,
ChannelVolume = 7,
Balance = 8,
// CC9 undefined
Pan = 10,
ExpressionController = 11,
EffectControl1 = 12,
EffectControl2 = 13,
// CC14 undefined
// CC15 undefined
GeneralPurposeController1 = 16,
GeneralPurposeController2 = 17,
GeneralPurposeController3 = 18,
GeneralPurposeController4 = 19,
DataEntryLSB = 38,
// Switches ----------------------------------------------------------------
Sustain = 64,
Portamento = 65,
Sostenuto = 66,
SoftPedal = 67,
Legato = 68,
Hold = 69,
// Low resolution continuous controllers -----------------------------------
SoundController1 = 70, ///< Synth: Sound Variation FX: Exciter On/Off
SoundController2 = 71, ///< Synth: Harmonic Content FX: Compressor On/Off
SoundController3 = 72, ///< Synth: Release Time FX: Distortion On/Off
SoundController4 = 73, ///< Synth: Attack Time FX: EQ On/Off
SoundController5 = 74, ///< Synth: Brightness FX: Expander On/Off
SoundController6 = 75, ///< Synth: Decay Time FX: Reverb On/Off
SoundController7 = 76, ///< Synth: Vibrato Rate FX: Delay On/Off
SoundController8 = 77, ///< Synth: Vibrato Depth FX: Pitch Transpose On/Off
SoundController9 = 78, ///< Synth: Vibrato Delay FX: Flange/Chorus On/Off
SoundController10 = 79, ///< Synth: Undefined FX: Special Effects On/Off
GeneralPurposeController5 = 80,
GeneralPurposeController6 = 81,
GeneralPurposeController7 = 82,
GeneralPurposeController8 = 83,
PortamentoControl = 84,
// CC85 to CC90 undefined
Effects1 = 91, ///< Reverb send level
Effects2 = 92, ///< Tremolo depth
Effects3 = 93, ///< Chorus send level
Effects4 = 94, ///< Celeste depth
Effects5 = 95, ///< Phaser depth
DataIncrement = 96,
DataDecrement = 97,
NRPNLSB = 98, ///< Non-Registered Parameter Number (LSB)
NRPNMSB = 99, ///< Non-Registered Parameter Number (MSB)
RPNLSB = 100, ///< Registered Parameter Number (LSB)
RPNMSB = 101, ///< Registered Parameter Number (MSB)
// Channel Mode messages ---------------------------------------------------
AllSoundOff = 120,
ResetAllControllers = 121,
LocalControl = 122,
AllNotesOff = 123,
OmniModeOff = 124,
OmniModeOn = 125,
MonoModeOn = 126,
PolyModeOn = 127
};
struct RPN
{
enum RegisteredParameterNumbers
{
PitchBendSensitivity = 0x0000,
ChannelFineTuning = 0x0001,
ChannelCoarseTuning = 0x0002,
SelectTuningProgram = 0x0003,
SelectTuningBank = 0x0004,
ModulationDepthRange = 0x0005,
NullFunction = (0x7f << 7) + 0x7f,
};
};
// -----------------------------------------------------------------------------
/*! \brief Create an instance of the library attached to a serial port.
You can use HardwareSerial or SoftwareSerial for the serial port.
Example: MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, midi2);
Then call midi2.begin(), midi2.read() etc..
*/
#define MIDI_CREATE_INSTANCE(Type, SerialPort, Name) \
midi::MidiInterface<Type> Name((Type&)SerialPort);
#if defined(ARDUINO_SAM_DUE) || defined(USBCON)
// Leonardo, Due and other USB boards use Serial1 by default.
#define MIDI_CREATE_DEFAULT_INSTANCE() \
MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);
#else
/*! \brief Create an instance of the library with default name, serial port
and settings, for compatibility with sketches written with pre-v4.2 MIDI Lib,
or if you don't bother using custom names, serial port or settings.
*/
#define MIDI_CREATE_DEFAULT_INSTANCE() \
MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI);
#endif
/*! \brief Create an instance of the library attached to a serial port with
custom settings.
@see DefaultSettings
@see MIDI_CREATE_INSTANCE
*/
#define MIDI_CREATE_CUSTOM_INSTANCE(Type, SerialPort, Name, Settings) \
midi::MidiInterface<Type, Settings> Name((Type&)SerialPort);
END_MIDI_NAMESPACE
[/spoiler]
Плата Arduino 2560 умеет быть миди устройством, если переставить перемычку на ней. Тогда она даже в системе отображается как миди устройство. В этом режиме достаточно работать просто миди командами.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
MIDI Блок
Повозился с миди блоком, видать сам не осилю, прошу помощи в исправлении ошибок. Никак не пойму как это правильно сделать в FLProg. Отдельно скетчем если делать то работает, а в FLProg не получается оформить.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
MIDI Блок
Обнаружил один неприятный баг, секция DeclareSection не правильно обрабатывает MIDI_CREATE_DEFAULT_INSTANCE(); показывая что данная строка является ошибочной , но при этом данная строка должна строго быть под #include <MIDI.h> и на оборот, если вставить MIDI_CREATE_DEFAULT_INSTANCE(); в секцию SetupSection, flprog считает что это верно, генерируя не рабочий скетч, в котором нужно руками переставлять MIDI_CREATE_DEFAULT_INSTANCE(); под #include <MIDI.h>. тогда всё собирается. В секции setup достаточно просто иметь MIDI.begin();
[spoiler] [/spoiler]
[spoiler] [/spoiler]
[spoiler] [/spoiler]
Надеюсь в новой версии FlProg пофиксят это и может таки получится с миди блоком...
[spoiler] [/spoiler]
[spoiler] [/spoiler]
[spoiler] [/spoiler]
Надеюсь в новой версии FlProg пофиксят это и может таки получится с миди блоком...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось pan 18 фев 2018, 15:16, всего редактировалось 1 раз.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
MIDI Блок
[ref]vd0[/ref], поздравляю, Вы нашли единомышленника. Есть у меня китайская игрушка на 48 клавиш кажись. Есть телефон с программой PerfectPiano. В этой проге есть возможность подключить USB MIDI устройство. Вот задумался над переделкой этой китайской игрушки на МИДИ инструмент. По схеме там клавиши считываются 8х8 (точно не помню). Такое считывание клавиатуры считаю категорически ТУПЫМ для хорошего инструмента (но этому простительно, его цена 15-20$). Поэтому однозначно буду ставить внутрь Мегу2560. Каждая клавиша на отдельный пин. Далее увидел у вас:
Есть интерес посылать по ЮСБ миди команды.
Так же есть опыт и рабочий блок по подключению UNO через 3 пина и пару резисторов к ЮСБ. И скетч, которым УНка определяется как USB HID-устройства. Из ФЛПрог можно в компьютер посылать нажатие клавиш и перемещения курсора мыши.
Можно подробней? Может Вы имели ввиду HID-устройство?vd0 писал(а): 16 фев 2018, 10:12Плата Arduino 2560 умеет быть миди устройством, если переставить перемычку на ней. Тогда она даже в системе отображается как миди устройство.
Есть интерес посылать по ЮСБ миди команды.
Так же есть опыт и рабочий блок по подключению UNO через 3 пина и пару резисторов к ЮСБ. И скетч, которым УНка определяется как USB HID-устройства. Из ФЛПрог можно в компьютер посылать нажатие клавиш и перемещения курсора мыши.
MIDI Блок
для работы и отображения устройства в таком виде и режиме нужно прошить его специальным загрузчиком и убрать вот эту перемычку. С перемычкой оно работает через юсб и определяется на COM порт. Если убрать то как на скриншоте. Однако сейчас испытываю некоторые трудности именно с оформлением миди блока в flprog. С братом делаем барабанную устрановку. Всё заработало, кроме миди блока в flprog, с его кодом до сих пор возимся.
[spoiler] [/spoiler]
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось vd0 19 фев 2018, 00:22, всего редактировалось 1 раз.
-
- Полковник
- Сообщения: 3360
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
MIDI Блок
Если так попробовать?vd0 писал(а): 18 фев 2018, 15:10секция DeclareSection не правильно обрабатывает MIDI_CREATE_DEFAULT_INSTANCE();
#include <MIDI.h>
#define MIDI_CREATE_DEFAULT_INSTANCE()
И поставить галочку использовать один раз.
Последний раз редактировалось aidar_i 19 фев 2018, 00:26, всего редактировалось 1 раз.
MIDI Блок
нет , макросом не пойдёт, тут проблема в том что flprog изначально не имеет миди поддержки. И специфика миди библиотеки требует строго под #include <MIDI.h> . Но DeclareSection так не считает. Я последние 3 дня с этим воюю, для отладки секции кода приходится в скетче его руками на своё место переставлять, что порядком уже поднадоело. В данным момент добились посылки миди команд, но почему то пока не передаёт номер ноты.
MIDI Блок
примерная конструкция на чайна тарелку, получаем сигнал от датчика china2, если аналоговый сигнал от china2 > china2_sens(чувствительность датчика). То делаем посылку команды с входящими параметрами.
[spoiler] [/spoiler]
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
MIDI Блок
[ref]vd0[/ref],
Еще подробней плиз. Выложите сюда этот загрузчик... Ну, короче опишите процесс замены загрузчика, что бы я время не тратил на поиски, а я пока займусь блоком.vd0 писал(а): 19 фев 2018, 00:20для работы и отображения устройства в таком виде и режиме нужно прошить его специальным загрузчиком и убрать вот эту перемычку
MIDI Блок
Онлайн сборка загрузчика тут. (Желательно использовать хром браузер на IE не работает).
Выбираем просто модель Uno или Mega. Device Name и Manufacturer произвольные, PID не трогаем. Нажимаем Compile и сохраняем готовый загрузчик. Вот исходники, если нужно.
Далее скачиваем Atmel Flip тут.
и заливаем загрузчик , предварительно выбрав свой чип.
[spoiler] [/spoiler]
В поле "Operations flow", находящемся слева под кнопками подключения и выбора устройства галочки поставить все.
[spoiler] [/spoiler]
Далее жмём "File" -> "Load HEX file" и выбираем файл загрузчика. После этого остаётся только в том же поле "Operations Flow" нажать кнопку "RUN". По окончании процесса прошивки, а пройдёт он быстро, в правом нижнем углу проверить наличие галки на "Reset" возле кнопки "Start Applcation", которую и нажимаем.
После этого устройство можно будет отключить и подключить заново. Без перемычки на пинах "MOSI2" -> "GND" оно будет определяться как midi устройство с заданными вами vendor ID(VID) и product ID(PID). Для работы платы в штатном режиме нужно поставить эту перемычку.
ВНИМАНИЕ!!!
Загрузчик тестировался мною только на чипе Atmega 16U2. Совместимость с другими чипами не проверял. Имеем только 16u2.
Выбираем просто модель Uno или Mega. Device Name и Manufacturer произвольные, PID не трогаем. Нажимаем Compile и сохраняем готовый загрузчик. Вот исходники, если нужно.
Далее скачиваем Atmel Flip тут.
и заливаем загрузчик , предварительно выбрав свой чип.
[spoiler] [/spoiler]
В поле "Operations flow", находящемся слева под кнопками подключения и выбора устройства галочки поставить все.
[spoiler] [/spoiler]
Далее жмём "File" -> "Load HEX file" и выбираем файл загрузчика. После этого остаётся только в том же поле "Operations Flow" нажать кнопку "RUN". По окончании процесса прошивки, а пройдёт он быстро, в правом нижнем углу проверить наличие галки на "Reset" возле кнопки "Start Applcation", которую и нажимаем.
После этого устройство можно будет отключить и подключить заново. Без перемычки на пинах "MOSI2" -> "GND" оно будет определяться как midi устройство с заданными вами vendor ID(VID) и product ID(PID). Для работы платы в штатном режиме нужно поставить эту перемычку.
ВНИМАНИЕ!!!
Загрузчик тестировался мною только на чипе Atmega 16U2. Совместимость с другими чипами не проверял. Имеем только 16u2.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
MIDI Блок
[ref]vd0[/ref],
блин, это только на тех платах, у которых на ЮСБ интерфейсе стоит атмелка. У меня все платы с FTDI микросхемами.
Похоже, в моем случае, надо брать две дуньки. Одну прошивать как ЮСБ интерфейс для второй (Меги).
Я поищу прошивку для ардуинки, которая может (на любых трех пинах подключенных напрямую в юсб) определить ее как USB MIDI.
С имитацией клавы и мышки (USB HID) получалось.
Наверно пожертвую одним юсб юартом, они кажись на атмелах. Завтра попробую.
блин, это только на тех платах, у которых на ЮСБ интерфейсе стоит атмелка. У меня все платы с FTDI микросхемами.
Похоже, в моем случае, надо брать две дуньки. Одну прошивать как ЮСБ интерфейс для второй (Меги).
Я поищу прошивку для ардуинки, которая может (на любых трех пинах подключенных напрямую в юсб) определить ее как USB MIDI.
С имитацией клавы и мышки (USB HID) получалось.
Наверно пожертвую одним юсб юартом, они кажись на атмелах. Завтра попробую.
MIDI Блок
для вашего случая где-то видел статью про ftdi tricks. у вас стоит микруха ft232rl? для неё должна быть прошивка под юсб-миди переходник. Но дело в том что эта микруха не позволит использовать устройство поочерёдно как юсб или ком-порт. её придётся каждый раз отшивать заново для обновления прошивки на меге. Либо сделать переходник на PIC контроллере и транслировать всё через serial. правда и этом случае подключение к телефону даст сомнительный результат ибо нагрузка на USB шину телефона возрастёт. Это всё очень неудобно))
Если же вам использование телефона не критично, то и прошивать ничего не нужно. Для тестов сойдёт и что-то типа hairless-midiserial. В этом случае будет слышно задержку больше 10мс. И для нормальной реализации задачи с миди-клавиатурой так же понадобится блок для FRS-датчиков. С ними реализуется передача velocity и функция aftertouch, без которых, по хорошему, клавиатура так игрушкой и останется.
лучше будет обзавестись платой Mega2560 R3. Остерегайтесь подделок. о продавцах я вообще молчу.. даже в инете с ревизиями путаница дикая, но на третьей ревизии нашей платы должен стоять чип 16u2. Это официальная информация от производителя.
Если же вам использование телефона не критично, то и прошивать ничего не нужно. Для тестов сойдёт и что-то типа hairless-midiserial. В этом случае будет слышно задержку больше 10мс. И для нормальной реализации задачи с миди-клавиатурой так же понадобится блок для FRS-датчиков. С ними реализуется передача velocity и функция aftertouch, без которых, по хорошему, клавиатура так игрушкой и останется.
лучше будет обзавестись платой Mega2560 R3. Остерегайтесь подделок. о продавцах я вообще молчу.. даже в инете с ревизиями путаница дикая, но на третьей ревизии нашей платы должен стоять чип 16u2. Это официальная информация от производителя.
MIDI Блок
кстати... чуть не забыл))
попутно я делаю ещё и миди-клавиатуру на 61 клавишу на базе старого синтезатора Casio, который ничем не лучше подобных китайских игрушек, но мне повезло немного меньше ибо используется stm32f103c8t6
тут вы совершенно правы)Сергей писал(а): 18 фев 2018, 20:45[ref]vd0[/ref], поздравляю, Вы нашли единомышленника. Есть у меня китайская игрушка на 48 клавиш кажись...
попутно я делаю ещё и миди-клавиатуру на 61 клавишу на базе старого синтезатора Casio, который ничем не лучше подобных китайских игрушек, но мне повезло немного меньше ибо используется stm32f103c8t6
скажем так, вас эта программа не сильно порадует) впрочем я не уверен что вам стоит говорить о синтезаторах на ПК(чего один только KONTAKT5 стоит...) думаю вы о них и так знаете)Есть телефон с программой PerfectPiano. В этой проге есть возможность подключить USB MIDI устройство. Вот задумался над переделкой этой китайской игрушки на МИДИ инструмент.
у меня тоже 8х8, но 61клавиша(5октав), но хороший инструмент надо ещё сделать. А хороший инструмент в нашем с вами случае так же должен ещё и имитировать хорошую механику(хотя бы полувзвешенную) и быть чувствительным к скорости нажатия клавиш(velocity) и уметь aftertouch. тут понадобится либо целая куча датчиков холла, либо один FSR датчик, но длинный и ленточный. И использовать мегу для этого совсем необязательно) есть же 74HC595. C регистрами и уно подойдёт.По схеме там клавиши считываются 8х8 (точно не помню). Такое считывание клавиатуры считаю категорически ТУПЫМ для хорошего инструмента (но этому простительно, его цена 15-20$). Поэтому однозначно буду ставить внутрь Мегу2560. Каждая клавиша на отдельный пин.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
MIDI Блок
почему? есть опыт использования?
Вообще я не музыкант (как кто то писал в интернете я аккордов не знаю, но зато паять умею)) ), думал ребенку пианинку переделать что б к мобильному девайсу подключить и пусть играется. Там звук по лучше чем на китайской игрушке.
А с тем железом, что имею на руках, получится только к ПК ардуинку подключить, и по компорту гнать ноты. Но неохота еще кучу программ запускать, которые будут с компорта данные преобразовывать.
Хотя, на свежую голову подумаю, может на стороне компа поставить ардуинку с блутуз модулем, а в игрушку аналогичную связку...
MIDI Блок
скорее есть опыт использования DAW и VST на более-менее нормальном оборудовании(пусть хоть и не без участия самодельного, в том числе и лампового). Ребёнка к пианинке подключить эт хорошо))) но более хороший результат будет если и пианинку хорошо подключить))
То есть хороший звук надо) а тут по классике жанра -- Creative SB Live как минимум+ASIO4All(дёшево и сердито) и какие-нибудь Sven BF21 и Kontakt 5 с кучей библиотек. Такая конфигурация уж точно даст результат получше чем у китайской игрушки)))
Отправлено спустя 19 минут 16 секунд:
Если так попробовать?
#include <MIDI.h>
#define MIDI_CREATE_DEFAULT_INSTANCE();
Директива #define определяет идентификатор и последовательность символов, которой будет замещаться данный идентификатор при его обнаружении в тексте программы. Идентификатор также называется именем макроса, а процесс замещения называется подстановкой макроса. Стандартный вид директивы следующий:
#define имя_макроса последовательность_символов
Обратим внимание, что в данном операторе отсутствует точка с запятой. Между идентификатором и последовательностью символов может быть любое число пробелов. Макрос завершается только переходом на новую строку.
Например, если необходимо использовать TRUE для значения 1, a FALSE для 0 то можно объявить следующие два макроса:
#define TRUE 1
#define FALSE 0
В результате, если компилятор обнаружит в тексте программы TRUE или FALSE, то он заменит их на 1 и 0 соответственно. А у нас другая ситуация, MIDI_CREATE_DEFAULT_INSTANCE(); вот пример применения
[spoiler]
#include <MIDI.h>
// Created and binds the MIDI interface to the default hardware Serial port
MIDI_CREATE_DEFAULT_INSTANCE();
void setup()
{
MIDI.begin(MIDI_CHANNEL_OMNI); // Listen to all incoming messages
}
void loop()
{
// Send note 42 with velocity 127 on channel 1
MIDI.sendNoteOn(42, 127, 1);
// Read incoming messages
MIDI.read();
}
[/spoiler]
из которого следует что это объявляется в DeclareSection, перед Setup и loop. О проблеме запихивания ногами миди инстанса описал выше))
То есть хороший звук надо) а тут по классике жанра -- Creative SB Live как минимум+ASIO4All(дёшево и сердито) и какие-нибудь Sven BF21 и Kontakt 5 с кучей библиотек. Такая конфигурация уж точно даст результат получше чем у китайской игрушки)))
Отправлено спустя 19 минут 16 секунд:
Если так попробовать?
#include <MIDI.h>
#define MIDI_CREATE_DEFAULT_INSTANCE();
Директива #define определяет идентификатор и последовательность символов, которой будет замещаться данный идентификатор при его обнаружении в тексте программы. Идентификатор также называется именем макроса, а процесс замещения называется подстановкой макроса. Стандартный вид директивы следующий:
#define имя_макроса последовательность_символов
Обратим внимание, что в данном операторе отсутствует точка с запятой. Между идентификатором и последовательностью символов может быть любое число пробелов. Макрос завершается только переходом на новую строку.
Например, если необходимо использовать TRUE для значения 1, a FALSE для 0 то можно объявить следующие два макроса:
#define TRUE 1
#define FALSE 0
В результате, если компилятор обнаружит в тексте программы TRUE или FALSE, то он заменит их на 1 и 0 соответственно. А у нас другая ситуация, MIDI_CREATE_DEFAULT_INSTANCE(); вот пример применения
[spoiler]
#include <MIDI.h>
// Created and binds the MIDI interface to the default hardware Serial port
MIDI_CREATE_DEFAULT_INSTANCE();
void setup()
{
MIDI.begin(MIDI_CHANNEL_OMNI); // Listen to all incoming messages
}
void loop()
{
// Send note 42 with velocity 127 on channel 1
MIDI.sendNoteOn(42, 127, 1);
// Read incoming messages
MIDI.read();
}
[/spoiler]
из которого следует что это объявляется в DeclareSection, перед Setup и loop. О проблеме запихивания ногами миди инстанса описал выше))
MIDI Блок
Вот это чудо пытаемся воскресить, имеем полностью рабочую механику. Теперь пытаемся прикрутить ардуиновские мозги 
[spoiler] [/spoiler]

[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя