первая же ссылка в топе указывает на аналогиный проект, я просто его адаптировал к своей железяке Korg DSS-1
справа под сообщением три точки - нажимаете их - появляются дополнительные кнопки. Кнопка с карандашом - редактирование
Конечно нет, кто ж вам даст чужие сообщения редактировать
Кнопка появляется только у ваших сообщений ![]()
Никого на этом форуме внешние ссылки не интересуют.
Если Вам лень описать, что именно Вы хотите, то, боюсь, никакой пользы от этой темы не будет.
Тебя читать - уйти в запой.
так уйди… пока есть время
Показываю на примере:
Цель: Доехать из Тулы до Воронежа за рулем автомобиля.
Действия: Открываю дверь, сажусь на водительское место, включаю зажигание…
Так вот, Вы начинаете сразу с пункта “Действия”. При этом, не нужно быть семи пядей во лбу, чтобы догадаться, что даже при крайне подробном описании действий, когда Вы повернете руль направо, когда - налево, а когда будете тормозить, весьма проблематично догадаться о цели всех этих манипуляций. Т.е. восстановить “из Тулы в Воронеж”.
Попытайтесь все-таки начать свое описание проекта с формулировки его цели.
Так роди уже - что ты хочешь?!!!
цель: описана в заголовке топика - MIDI мониторинг за аппартным Arduino nano, или что не так с скетчем?
как еще проще обьяснить?
файл кода не мой, и размещен на github - для всеобщего пользования…
хочу добится работоспособности на лабораторных условиях - то есть под наблюдением MIDI-мониторинга…
вот код:
// Korg EX/DW-8000 and DSS-1 MIDI Enhancer
// By Steve Baines 2016 mode by Vladistone 2023
// See:
// https://hackaday.io/
#include <MIDI.h>
//void setup() {
// MIDI.begin();
// Serial.begin(38400);
//}
// Create MIDI interface on main hardware serial port
// (Tx/Rx pins on Arduino board)
MIDI_CREATE_DEFAULT_INSTANCE();
// -----------------------------------------------------------------------------
// This function will be automatically called when a NoteOn is received.
// It must be a void-returning function with the correct parameters,
// see documentation here:
// http://arduinomidilib.fortyseveneffects.com/a00022.html
const int ledPinOut = 13;
// 0 here is 1 on DW-8000 - need to set Param 83 to 1
const int dwChannel = 0;
// Also need to set Param 84 to 2, otherwise SYSEX messages are ignored.
void sendDw8000Param(byte channel, byte paramOffset, byte paramValue7Bit)
{
MIDI.begin();
Serial.begin(31250);
const int sysexLen = 8;
static byte sysexData[sysexLen] = {
0xf0, // 0 Sysex start
0x42, // 1 Manufacturer ID: 42, Korg
0x30, // 2 Channel 1
0x0b, // 3 Device ID: 03, for EX/DW-8000; 0b - for DSS-1
0x41, // 4 Message: 41, Parameter change
0x00, // 5 Parameter Offset number (which parameter we want to change)
0x00, // 6 Parameter value
0xf7 // 7 Sysex end
};
// paramValue7Bit is assumed to run from 0 to 127 in all cases,
paramValue7Bit &= 0x7f;
#if(0)
case 0: // OSC 1 Octave (2b)
case 1: // OSC 1 Waveform (4b)
case 2: // OSC 1 Level (5b)
case 3: // Auto Bend Select (2b)
case 4: // A. Bend Mode (1b)
case 5: // A. Bend Time (5b)
case 6: // A. Bend Intensity (5b)
case 7: // OSC 2 Octave (2b)
case 8: // OSC 2 Waveform (4b)
case 9: // OSC 2 Level (5b)
case 10: // Interval (3b)
case 11: // Detune (3b)
case 12: // Noise Level (5b)
case 13: // Assign Mode (2b)
case 14: // Parameter No. Memory (6b)
case 15: // Cutoff (6b)
case 16: // Resonance (5b)
case 17: // Keyboard Tracking (2b)
case 18: // Polarity (1b)
case 19: // EG. Intensity (5b)
case 20: // VCF Attack (5b)
case 21: // VCF Decay (5b)
case 22: // VCF Breakpoint (5b)
case 23: // VCF Slope (5b)
case 24: // VCF Sustain (5b)
case 25: // VCF Release (5b)
case 26: // VCF Velocity Sensitivity (3b)
case 27: // VCA Attack (5b)
case 28: // VCA Decay (5b)
case 29: // VCA Breakpoint (5b)
case 30: // VCA Slope (5b)
case 31: // VCA Sustain (5b)
case 32: // VCA Release (5b)
case 33: // VCA Velocity Sensitivity (3b)
case 34: // MG Waveform (2b)
case 35: // MG Frequency (5b)
case 36: // MG Delay (5b)
case 37: // MG OSC (5b)
case 38: // MG VCF (5b)
case 39: // Bend OSC (4b)
case 40: // Bend VCF (1b)
case 41: // Delay Time (3b)
case 42: // Delay Factor (4b)
case 43: // Delay Feedback (4b)
case 44: // Delay Frequency (5b)
case 45: // Delay Intensity (5b)
case 46: // Delay Effect Level (4b)
case 47: // Portamento (5b)
case 48: // Aftertouch OSC MG (2b)
case 49: // Aftertouch VCF (2b)
case 50: // Aftertouch VCA (2b)
#endif
// so here we rescale to fit to appropriate bit width for each parameter
byte paramValueScaled = 0;
switch (paramOffset)
{
case 4: // A. Bend Mode (1b)
case 18: // Polarity (1b)
case 40: // Bend VCF (1b)
paramValueScaled = paramValue7Bit >> 6;
break;
case 0: // OSC 1 Octave (2b)
case 3: // Auto Bend Select (2b)
case 7: // OSC 2 Octave (2b)
case 13: // Assign Mode (2b)
case 17: // Keyboard Tracking (2b)
case 34: // MG Waveform (2b)
case 48: // Aftertouch OSC MG (2b)
case 49: // Aftertouch VCF (2b)
case 50: // Aftertouch VCA (2b)
paramValueScaled = paramValue7Bit >> 5;
break;
case 10: // Interval (3b)
case 11: // Detune (3b)
case 26: // VCF Velocity Sensitivity (3b)
case 33: // VCA Velocity Sensitivity (3b)
case 41: // Delay Time (3b)
paramValueScaled = paramValue7Bit >> 4;
break;
case 1: // OSC 1 Waveform (4b)
case 8: // OSC 2 Waveform (4b)
case 39: // Bend OSC (4b)
case 42: // Delay Factor (4b)
case 43: // Delay Feedback (4b)
case 46: // Delay Effect Level (4b)
paramValueScaled = paramValue7Bit >> 3;
break;
case 2: // OSC 1 Level (5b)
case 5: // A. Bend Time (5b)
case 6: // A. Bend Intensity (5b)
case 9: // OSC 2 Level (5b)
case 12: // Noise Level (5b)
case 16: // Resonance (5b)
case 19: // EG. Intensity (5b)
case 20: // VCF Attack (5b)
case 21: // VCF Decay (5b)
case 22: // VCF Breakpoint (5b)
case 23: // VCF Slope (5b)
case 24: // VCF Sustain (5b)
case 25: // VCF Release (5b)
case 27: // VCA Attack (5b)
case 28: // VCA Decay (5b)
case 29: // VCA Breakpoint (5b)
case 30: // VCA Slope (5b)
case 31: // VCA Sustain (5b)
case 32: // VCA Release (5b)
case 35: // MG Frequency (5b)
case 36: // MG Delay (5b)
case 37: // MG OSC (5b)
case 38: // MG VCF (5b)
case 44: // Delay Frequency (5b)
case 45: // Delay Intensity (5b)
case 47: // Portamento (5b)
paramValueScaled = paramValue7Bit >> 2;
break;
case 14: // Parameter No. Memory (6b)
case 15: // Cutoff (6b)
paramValueScaled = paramValue7Bit >> 1;
break;
default:
return; // Unknown parameter - ignore
}
sysexData[2] = 0x30 | (channel & 0x0f); // Set channel number
sysexData[5] = paramOffset;
sysexData[6] = paramValueScaled;
MIDI.sendSysEx(sysexLen, sysexData, true);
}
void handleNoteOn(byte channel, byte pitch, byte velocity)
{
// Do whatever you want when a note is pressed.
digitalWrite(ledPinOut, HIGH); // turn the LED on
MIDI.sendNoteOn(pitch, velocity, channel);
}
void handleNoteOff(byte channel, byte pitch, byte velocity)
{
// Do something when the note is released.
// Note that NoteOn messages with 0 velocity are interpreted as NoteOffs.
digitalWrite(ledPinOut, LOW); // turn the LED off
MIDI.sendNoteOff(pitch, velocity, channel);
}
void handleControlChange(byte channel, byte number, byte value)
{
if (channel != dwChannel)
{ // If CC not sent to DW-8000 channel, then just pass them on
MIDI.sendControlChange(number, value, channel);
return;
}
// Map from received CC numbers to corresponding DW-8000 Parameter offset numbers
switch(number)
{
// CC number Param. Offset
// || ||
// Mappings to common CCs: (See http://nickfever.com/music/midi-cc-list)
case 5: sendDw8000Param(channel, 47, value); break; // Portamento Time
case 70: sendDw8000Param(channel, 1, value); break; // (Sound Variation) OSC1 Waveform
case 71: sendDw8000Param(channel, 16, value); break; // Resonance
case 72: sendDw8000Param(channel, 32, value); break; // VCA Release
case 73: sendDw8000Param(channel, 27, value); break; // VCA Attack
case 74: sendDw8000Param(channel, 15, value); break; // Cutoff Freq
// Arbitrary mappings from generic CCs to remaining params
case 75: sendDw8000Param(channel, 34, value); break; // MG Waveform (2b)
case 76: sendDw8000Param(channel, 35, value); break; // MG Frequency (5b)
case 77: sendDw8000Param(channel, 36, value); break; // MG Delay (5b)
case 78: sendDw8000Param(channel, 37, value); break; // MG OSC (5b)
case 79: sendDw8000Param(channel, 38, value); break; // MG VCF (5b)
case 16: sendDw8000Param(channel, 3, value); break; // Auto Bend Select (2b)
case 17: sendDw8000Param(channel, 4, value); break; // A. Bend Mode (1b)
case 18: sendDw8000Param(channel, 5, value); break; // A. Bend Time (5b)
case 19: sendDw8000Param(channel, 6, value); break; // A. Bend Intensity (5b)
case 20: sendDw8000Param(channel, 20, value); break; // VCF Attack (5b)
case 21: sendDw8000Param(channel, 21, value); break; // VCF Decay (5b)
case 22: sendDw8000Param(channel, 22, value); break; // VCF Breakpoint (5b)
case 23: sendDw8000Param(channel, 23, value); break; // VCF Slope (5b)
case 24: sendDw8000Param(channel, 24, value); break; // VCF Sustain (5b)
case 25: sendDw8000Param(channel, 25, value); break; // VCF Release (5b)
case 26: sendDw8000Param(channel, 26, value); break; // VCF Velocity Sensitivity (3b)
case 27: sendDw8000Param(channel, 28, value); break; // VCA Decay (5b)
case 28: sendDw8000Param(channel, 29, value); break; // VCA Breakpoint (5b)
case 29: sendDw8000Param(channel, 30, value); break; // VCA Slope (5b)
case 30: sendDw8000Param(channel, 31, value); break; // VCA Sustain (5b)
case 31: sendDw8000Param(channel, 33, value); break; // VCA Velocity Sensitivity (3b)
case 85: sendDw8000Param(channel, 41, value); break; // Delay Time (3b)
case 86: sendDw8000Param(channel, 42, value); break; // Delay Factor (4b)
case 87: sendDw8000Param(channel, 43, value); break; // Delay Feedback (4b)
case 88: sendDw8000Param(channel, 44, value); break; // Delay Frequency (5b)
case 89: sendDw8000Param(channel, 45, value); break; // Delay Intensity (5b)
case 90: sendDw8000Param(channel, 46, value); break; // Delay Effect Level (4b)
case 102: sendDw8000Param(channel, 0, value); break; // OSC 1 Octave (2b)
case 103: sendDw8000Param(channel, 2, value); break; // OSC 1 Level (5b)
case 104: sendDw8000Param(channel, 7, value); break; // OSC 2 Octave (2b)
case 105: sendDw8000Param(channel, 8, value); break; // OSC 2 Waveform (4b)
case 106: sendDw8000Param(channel, 9, value); break; // OSC 2 Level (5b)
case 107: sendDw8000Param(channel, 10, value); break; // Interval (3b)
case 94: sendDw8000Param(channel, 11, value); break; // Detune (3b)
case 109: sendDw8000Param(channel, 12, value); break; // Noise Level (5b)
case 110: sendDw8000Param(channel, 13, value); break; // Assign Mode (2b)
case 111: sendDw8000Param(channel, 14, value); break; // Parameter No. Memory (6b)
case 112: sendDw8000Param(channel, 17, value); break; // Keyboard Tracking (2b)
case 113: sendDw8000Param(channel, 18, value); break; // Polarity (1b)
case 114: sendDw8000Param(channel, 19, value); break; // EG. Intensity (5b)
case 115: sendDw8000Param(channel, 39, value); break; // Bend OSC (4b)
case 116: sendDw8000Param(channel, 40, value); break; // Bend VCF (1b)
case 117: sendDw8000Param(channel, 48, value); break; // Aftertouch OSC MG (2b)
case 118: sendDw8000Param(channel, 49, value); break; // Aftertouch VCF (2b)
case 119: sendDw8000Param(channel, 50, value); break; // Aftertouch VCA (2b)
#if(0)
CC Param Offset
102 case 0: // OSC 1 Octave (2b)
70 case 1: // OSC 1 Waveform (4b)
103 case 2: // OSC 1 Level (5b)
16 case 3: // Auto Bend Select (2b)
17 case 4: // A. Bend Mode (1b)
18 case 5: // A. Bend Time (5b)
19 case 6: // A. Bend Intensity (5b)
104 case 7: // OSC 2 Octave (2b)
105 case 8: // OSC 2 Waveform (4b)
106 case 9: // OSC 2 Level (5b)
107 case 10: // Interval (3b)
94 case 11: // Detune (3b)
109 case 12: // Noise Level (5b)
110 case 13: // Assign Mode (2b)
111 case 14: // Parameter No. Memory (6b)
74 case 15: // Cutoff (6b)
71 case 16: // Resonance (5b)
112 case 17: // Keyboard Tracking (2b)
113 case 18: // Polarity (1b)
114 case 19: // EG. Intensity (5b)
20 case 20: // VCF Attack (5b)
21 case 21: // VCF Decay (5b)
22 case 22: // VCF Breakpoint (5b)
23 case 23: // VCF Slope (5b)
24 case 24: // VCF Sustain (5b)
25 case 25: // VCF Release (5b)
26 case 26: // VCF Velocity Sensitivity (3b)
73 case 27: // VCA Attack (5b)
27 case 28: // VCA Decay (5b)
28 case 29: // VCA Breakpoint (5b)
29 case 30: // VCA Slope (5b)
30 case 31: // VCA Sustain (5b)
72 case 32: // VCA Release (5b)
31 case 33: // VCA Velocity Sensitivity (3b)
75 case 34: // MG Waveform (2b)
76 case 35: // MG Frequency (5b)
77 case 36: // MG Delay (5b)
78 case 37: // MG OSC (5b)
79 case 38: // MG VCF (5b)
115 case 39: // Bend OSC (4b)
116 case 40: // Bend VCF (1b)
85 case 41: // Delay Time (3b)
86 case 42: // Delay Factor (4b)
87 case 43: // Delay Feedback (4b)
88 case 44: // Delay Frequency (5b)
89 case 45: // Delay Intensity (5b)
90 case 46: // Delay Effect Level (4b)
5 case 47: // Portamento (5b)
117 case 48: // Aftertouch OSC MG (2b)
118 case 49: // Aftertouch VCF (2b)
119 case 50: // Aftertouch VCA (2b)
#endif
default:
// If not explicitly remapped, pass on
MIDI.sendControlChange(number, value, channel);
break;
}
}
void handleProgramChange(byte channel, byte number)
{
MIDI.sendProgramChange(number, channel);
}
void handleAfterTouchChannel(byte channel, byte pressure)
{
MIDI.sendAfterTouch(pressure, channel);
}
void handlePitchBend(byte channel, int bend)
{
MIDI.sendPitchBend(bend, channel);
}
void handleSystemExclusive(byte* arrayData, unsigned arrayLen)
{
MIDI.sendSysEx(arrayLen, arrayData, false);
}
// -----------------------------------------------------------------------------
void setup()
{
// initialize digital pin with LED as an output.
pinMode(ledPinOut, OUTPUT);
digitalWrite(ledPinOut, LOW); // turn the LED off by making the voltage LOW
// Connect the handleNoteOn function to the library,
// so it is called upon reception of a NoteOn.
MIDI.setHandleNoteOn(handleNoteOn); // Put only the name of the function
// Do the same for NoteOffs
MIDI.setHandleNoteOff(handleNoteOff);
MIDI.setHandleControlChange(handleControlChange);
MIDI.setHandleProgramChange(handleProgramChange);
MIDI.setHandleAfterTouchChannel(handleAfterTouchChannel);
MIDI.setHandlePitchBend(handlePitchBend);
MIDI.setHandleSystemExclusive(handleSystemExclusive);
// Initiate MIDI communications, listen to all channels
MIDI.begin(MIDI_CHANNEL_OMNI);
MIDI.turnThruOff(); // Prevent passthrough
}
void loop()
{
// Call MIDI.read the fastest you can for real-time performance.
MIDI.read();
// There is no need to check if there are messages incoming
// if they are bound to a Callback function.
// The attached method will be called automatically
// when the corresponding message has been received.
}
все работает, а код- не могу запустить
А что ж тогда работает?
“телевизор работает, правда изображения и звука нет” - так чтоль?
обвесы на телевизор
Если серьезно - попытайтесь изьяснятся как-то яснее.
“Не могу запустить код” что значит? Он компилируется?
Если нет - покажите вывод ИДЕ с ошибками.
Если да - тогда опишите что код должен делать по замыслу и что он делает на самом деле.
… И я думаю одним запоем не обойтись, тут алкотур на полгода нужен )))
код перкомпилирован и отправлен на Arduino
Arduino при подключении в сам аппарат и отдельно по MIDI- интерфесу моргает Rx-Tx и отправляет взад теже сообщения что и принял (т.е. MIDI CC#, MIDI note и т.п.)
USB2MIDI i-face тоже моргает и двигает туда-сюда MIDI-события (и даже SysEx-сы)
но вот как проверить почему из “СиСи” не рождаются “сусексы” и исправить проблему (возможно в коде) - я не пойму…
А что это такое?
я в этом мало понимаю, но просто из кода, Сусексы могут рождатся только из сообщений controlChange, посланных по нулевому каналу. А вы по какому шлете?
Нулевой - это первый
/ 0 here is 1 on DW-8000 - need to set Param 83 to 1
const int dwChannel = 0;
и MIDIмонитор говорит что все идет по одному и тому же каналу
0xB0 - в этом месте 0 - hex код канала (1)
генерируется код тоже по 1-му каналу
static byte sysexData[sysexLen] = {
0xf0, // 0 Sysex start
0x42, // 1 Manufacturer ID: 42, Korg
**0x30**, // 2 Channel **1**
0x0b, // 3 Device ID: 03, for EX/DW-8000; 0b - for DSS-1
0x41, // 4 Message: 41, Parameter change
0x00, // 5 Parameter Offset number (which parameter we want to change)
0x00, // 6 Parameter value
0xf7 // 7 Sysex end
};
Я не знаю, зачем вы мне эти картинки показываете, может у вас первый канал это нулевой или 0х30 даже…
Я смотрю в код:
и тут ясно написано - если в вашем СС первый парметр не ноль - пакет будет отброшен и Сусекс не родится
Поэтому вопрос - в тех СС, что вы посылаете, парметр канал чему равен?
меня заинтересовал комментарий про возможное несоответствие или “корявость” синтаксиса подобного операнда “с продолжением”
#if(0)
case 0: // OSC 1 Octave (2b)
case 1: // OSC 1 Waveform (4b)
case 2: // OSC 1 Level (5b)
case 3: // Auto Bend Select (2b)
case 4: // A. Bend Mode (1b)
case 5: // A. Bend Time (5b)
case 6: // A. Bend Intensity (5b)
case 7: // OSC 2 Octave (2b)
case 8: // OSC 2 Waveform (4b)
case 9: // OSC 2 Level (5b)
case 10: // Interval (3b)
case 11: // Detune (3b)
case 12: // Noise Level (5b)
case 13: // Assign Mode (2b)
case 14: // Parameter No. Memory (6b)
case 15: // Cutoff (6b)
case 16: // Resonance (5b)
case 17: // Keyboard Tracking (2b)
case 18: // Polarity (1b)
case 19: // EG. Intensity (5b)
case 20: // VCF Attack (5b)
case 21: // VCF Decay (5b)
case 22: // VCF Breakpoint (5b)
case 23: // VCF Slope (5b)
case 24: // VCF Sustain (5b)
case 25: // VCF Release (5b)
case 26: // VCF Velocity Sensitivity (3b)
case 27: // VCA Attack (5b)
case 28: // VCA Decay (5b)
case 29: // VCA Breakpoint (5b)
case 30: // VCA Slope (5b)
case 31: // VCA Sustain (5b)
case 32: // VCA Release (5b)
case 33: // VCA Velocity Sensitivity (3b)
case 34: // MG Waveform (2b)
case 35: // MG Frequency (5b)
case 36: // MG Delay (5b)
case 37: // MG OSC (5b)
case 38: // MG VCF (5b)
case 39: // Bend OSC (4b)
case 40: // Bend VCF (1b)
case 41: // Delay Time (3b)
case 42: // Delay Factor (4b)
case 43: // Delay Feedback (4b)
case 44: // Delay Frequency (5b)
case 45: // Delay Intensity (5b)
case 46: // Delay Effect Level (4b)
case 47: // Portamento (5b)
case 48: // Aftertouch OSC MG (2b)
case 49: // Aftertouch VCF (2b)
case 50: // Aftertouch VCA (2b)
#endif
там таких блоков несколько
50- строка (описана выше)
279 - строка
#if(0)
CC Param Offset
102 case 0: // OSC 1 Octave (2b)
70 case 1: // OSC 1 Waveform (4b)
103 case 2: // OSC 1 Level (5b)
16 case 3: // Auto Bend Select (2b)
17 case 4: // A. Bend Mode (1b)
18 case 5: // A. Bend Time (5b)
19 case 6: // A. Bend Intensity (5b)
104 case 7: // OSC 2 Octave (2b)
105 case 8: // OSC 2 Waveform (4b)
106 case 9: // OSC 2 Level (5b)
107 case 10: // Interval (3b)
94 case 11: // Detune (3b)
109 case 12: // Noise Level (5b)
110 case 13: // Assign Mode (2b)
111 case 14: // Parameter No. Memory (6b)
74 case 15: // Cutoff (6b)
71 case 16: // Resonance (5b)
112 case 17: // Keyboard Tracking (2b)
113 case 18: // Polarity (1b)
114 case 19: // EG. Intensity (5b)
20 case 20: // VCF Attack (5b)
21 case 21: // VCF Decay (5b)
22 case 22: // VCF Breakpoint (5b)
23 case 23: // VCF Slope (5b)
24 case 24: // VCF Sustain (5b)
25 case 25: // VCF Release (5b)
26 case 26: // VCF Velocity Sensitivity (3b)
73 case 27: // VCA Attack (5b)
27 case 28: // VCA Decay (5b)
28 case 29: // VCA Breakpoint (5b)
29 case 30: // VCA Slope (5b)
30 case 31: // VCA Sustain (5b)
72 case 32: // VCA Release (5b)
31 case 33: // VCA Velocity Sensitivity (3b)
75 case 34: // MG Waveform (2b)
76 case 35: // MG Frequency (5b)
77 case 36: // MG Delay (5b)
78 case 37: // MG OSC (5b)
79 case 38: // MG VCF (5b)
115 case 39: // Bend OSC (4b)
116 case 40: // Bend VCF (1b)
85 case 41: // Delay Time (3b)
86 case 42: // Delay Factor (4b)
87 case 43: // Delay Feedback (4b)
88 case 44: // Delay Frequency (5b)
89 case 45: // Delay Intensity (5b)
90 case 46: // Delay Effect Level (4b)
5 case 47: // Portamento (5b)
117 case 48: // Aftertouch OSC MG (2b)
118 case 49: // Aftertouch VCF (2b)
119 case 50: // Aftertouch VCA (2b)
#endif

