-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGridMidi.h
69 lines (62 loc) · 2.34 KB
/
GridMidi.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#pragma once
// ======================================================================
// WinGridStrument - a Windows touchscreen musical instrument
// Copyright(C) 2020 Roger Allen
//
// This program 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.
//
// This program 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 this program. If not, see <https://www.gnu.org/licenses/>.
// ======================================================================
#include "GridSynth.h"
#include <windows.h>
#include <mmsystem.h>
// type which is both an integer and an array of characters:
// typedef union midimessage { unsigned long word; unsigned char data[4]; } MidiMessage;
class MidiMessage
{
union { unsigned long word; unsigned char data[4]; } msg;
public:
MidiMessage(int d0, int d1, int d2) {
msg.data[0] = static_cast<unsigned char>(d0);
msg.data[1] = static_cast<unsigned char>(d1);
msg.data[2] = static_cast<unsigned char>(d2);
msg.data[3] = 0;
};
unsigned long data() { return msg.word; }
};
// https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message
namespace MIDI {
const int
NOTE_OFF = 0x80,
NOTE_ON = 0x90,
POLY_KEY_PRESSURE = 0xa0,
CONTROL_CHANGE = 0xb0,
PROGRAM_CHANGE = 0xc0,
CHANNEL_PRESSURE = 0xd0,
PITCH_BEND = 0xe0,
SYS_EX = 0xf0;
};
class GridMidi
{
HMIDIOUT midi_device_;
GridSynth *grid_synth_;
bool play_midi_;
bool play_synth_;
public:
GridMidi(HMIDIOUT midiDevice, GridSynth *gridSynth);
void playMidi(bool playMidi) { play_midi_ = playMidi; }
void playSynth(bool playSynth) { play_synth_ = playSynth; }
void noteOn(int channel, int note, int midi_pressure);
void pitchBend(int channel, int mod_pitch);
void controlChange(int channel, int controller, int mod_modulation);
void polyKeyPressure(int channel, int key, int pressure);
};