First working version :

- pots
 - keyboard
 - octave selction
This commit is contained in:
2019-02-22 14:16:22 +01:00
parent 01e81abdde
commit 70ccae1ba4
19 changed files with 1866 additions and 650 deletions
@@ -0,0 +1,122 @@
/*
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);
}