70ccae1ba4
- pots - keyboard - octave selction
123 lines
3.3 KiB
C++
123 lines
3.3 KiB
C++
/*
|
|
This file is part of ttymidi.
|
|
|
|
ttymidi is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ttymidi is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with ttymidi. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
// file version 0.60
|
|
|
|
#include "ardumidi.h"
|
|
#include "HardwareSerial.h"
|
|
|
|
void midi_note_off(byte channel, byte key, byte velocity)
|
|
{
|
|
midi_command(0x80, channel, key, velocity);
|
|
}
|
|
|
|
void midi_note_on(byte channel, byte key, byte velocity)
|
|
{
|
|
midi_command(0x90, channel, key, velocity);
|
|
}
|
|
|
|
void midi_key_pressure(byte channel, byte key, byte value)
|
|
{
|
|
midi_command(0xA0, channel, key, value);
|
|
}
|
|
|
|
void midi_controller_change(byte channel, byte control, byte value)
|
|
{
|
|
midi_command(0xB0, channel, control, value);
|
|
}
|
|
|
|
void midi_program_change(byte channel, byte program)
|
|
{
|
|
midi_command_short(0xC0, channel, program);
|
|
}
|
|
|
|
void midi_channel_pressure(byte channel, byte value)
|
|
{
|
|
midi_command_short(0xD0, channel, value);
|
|
}
|
|
|
|
void midi_pitch_bend(byte channel, int value)
|
|
{
|
|
midi_command(0xE0, channel, value & 0x7F, value >> 7);
|
|
}
|
|
|
|
void midi_command(byte command, byte channel, byte param1, byte param2)
|
|
{
|
|
Serial.print(command | (channel & 0x0F), BYTE);
|
|
Serial.print(param1 & 0x7F, BYTE);
|
|
Serial.print(param2 & 0x7F, BYTE);
|
|
}
|
|
|
|
void midi_command_short(byte command, byte channel, byte param1)
|
|
{
|
|
Serial.print(command | (channel & 0x0F), BYTE);
|
|
Serial.print(param1 & 0x7F, BYTE);
|
|
}
|
|
|
|
void midi_print(char* msg, int len)
|
|
{
|
|
Serial.print(0xFF, BYTE);
|
|
Serial.print(0x00, BYTE);
|
|
Serial.print(0x00, BYTE);
|
|
Serial.print(len , BYTE);
|
|
Serial.print(msg);
|
|
}
|
|
|
|
void midi_comment(char* msg)
|
|
{
|
|
int len = 0;
|
|
char* ptr = msg;
|
|
while (*ptr++) len++;
|
|
midi_print(msg, len);
|
|
}
|
|
|
|
int midi_message_available() {
|
|
/*
|
|
This bit will check that next bytes to be read would actually
|
|
have the midi status bit. If not it will remove uncorrect bytes
|
|
from internal buffer
|
|
*/
|
|
while ((Serial.available() > 0) && ((Serial.peek() & B10000000) != 0x80)) {
|
|
Serial.read();
|
|
}
|
|
|
|
/* Well we don't exactly know how many commands there might be in the Serial buffer
|
|
so we'll just guess it according the type of message that happens to be waiting
|
|
in the buffer. At least we get first one right! */
|
|
byte command = Serial.peek() & 11110000;
|
|
if (command != MIDI_PROGRAM_CHANGE && command != MIDI_CHANNEL_PRESSURE) {
|
|
return (Serial.available()/2);
|
|
}
|
|
return (Serial.available()/3);
|
|
}
|
|
|
|
MidiMessage read_midi_message() {
|
|
MidiMessage message;
|
|
byte midi_status = Serial.read();
|
|
message.command = (midi_status & B11110000);
|
|
message.channel = (midi_status & B00001111);
|
|
message.param1 = Serial.read();
|
|
if (message.command != MIDI_PROGRAM_CHANGE && message.command != MIDI_CHANNEL_PRESSURE) {
|
|
message.param2 = Serial.read();
|
|
}
|
|
return message;
|
|
}
|
|
|
|
int get_pitch_bend(MidiMessage m) {
|
|
return (m.param1 & 0x7F) + ((m.param2 & 0x7F) << 7);
|
|
}
|
|
|