parent
88060a4225
commit
7e05ffd561
@ -0,0 +1,170 @@ |
||||
# Config File for User-defined Instant Mappings |
||||
|
||||
# We assume that the controls on your MIDI controller |
||||
# send CCs (except for pads). All controls that do not have |
||||
# an explicit channel setting are expected to use the |
||||
# global channel. CCs & Notes are counted from 0-127 |
||||
# and channels from 0-15. |
||||
|
||||
[Globals] |
||||
# The channel that the controller should send on |
||||
GlobalChannel: 0 |
||||
# If your controller is connected via USB, replace ControllerName |
||||
# with the name of the respective port. Live will then try to |
||||
# recognize the ports for you when you select your Instant-Mappings |
||||
InputName: SparkFun Pro Micro |
||||
OutputName: SparkFun Pro Micro |
||||
# If your controller has pads that send notes, you can use them to |
||||
# play the visible pads in your DrumRacks. Just replace the -1 for |
||||
# the note (and channel) of the respective pad. The arrangement of |
||||
# the pads in the DrumRacks is as follows: |
||||
# 1 2 3 4 |
||||
# 5 6 7 8 |
||||
# 9 10 11 12 |
||||
# 13 14 15 16 |
||||
# (If you leave the channel of a pad at -1, Live will assume that |
||||
# the pad uses the global channel) |
||||
Pad1Note: 69 |
||||
Pad2Note: 70 |
||||
Pad3Note: 71 |
||||
Pad4Note: 72 |
||||
Pad5Note: 73 |
||||
Pad6Note: 74 |
||||
Pad7Note: 75 |
||||
Pad8Note: 76 |
||||
Pad9Note: 77 |
||||
Pad10Note: 78 |
||||
Pad11Note: 79 |
||||
Pad12Note: 80 |
||||
Pad13Note: 81 |
||||
Pad14Note: 82 |
||||
Pad15Note: 83 |
||||
Pad16Note: 84 |
||||
Pad1Channel: -1 |
||||
Pad2Channel: -1 |
||||
Pad3Channel: -1 |
||||
Pad4Channel: -1 |
||||
Pad5Channel: -1 |
||||
Pad6Channel: -1 |
||||
Pad7Channel: -1 |
||||
Pad8Channel: -1 |
||||
Pad9Channel: -1 |
||||
Pad10Channel: -1 |
||||
Pad11Channel: -1 |
||||
Pad12Channel: -1 |
||||
Pad13Channel: -1 |
||||
Pad14Channel: -1 |
||||
Pad15Channel: -1 |
||||
Pad16Channel: -1 |
||||
|
||||
[DeviceControls] |
||||
# The Encoders will control the device parameters (you can also |
||||
# use knobs or sliders). Replace the -1's with the CCs sent by |
||||
# the respective controls on your controller. You can also set |
||||
# the channel for each controller if it differs from the global |
||||
# channel (if you leave the channel of an encoder at -1, Live |
||||
# will assume that the encoder uses the global channel). |
||||
Encoder1: -1 |
||||
Encoder2: -1 |
||||
Encoder3: -1 |
||||
Encoder4: -1 |
||||
Encoder5: -1 |
||||
Encoder6: -1 |
||||
Encoder7: -1 |
||||
Encoder8: -1 |
||||
EncoderChannel1: -1 |
||||
EncoderChannel2: -1 |
||||
EncoderChannel3: -1 |
||||
EncoderChannel4: -1 |
||||
EncoderChannel5: -1 |
||||
EncoderChannel6: -1 |
||||
EncoderChannel7: -1 |
||||
EncoderChannel8: -1 |
||||
# Enter the respective map mode for the encoders here. The following |
||||
# map modes are available: |
||||
# - Absolute |
||||
# - Absolute14Bit |
||||
# - LinearSignedBit |
||||
# - LinearSignedBit2 |
||||
# - LinearTwoCompliment |
||||
# - LinearBinaryOffset |
||||
# - AccelSignedBit |
||||
# - AccelSignedBit2 |
||||
# - AccelTwoCompliment |
||||
# - AccelBinaryOffset |
||||
# Consult the controller's documentation to find out which mode to use. |
||||
EncoderMapMode: Absolute |
||||
# Buttons used here are expected to not be toggles (i.e., sending |
||||
# value 0 every second time you press it). |
||||
Bank1Button: -1 |
||||
Bank2Button: -1 |
||||
Bank3Button: -1 |
||||
Bank4Button: -1 |
||||
Bank5Button: -1 |
||||
Bank6Button: -1 |
||||
Bank7Button: -1 |
||||
Bank8Button: -1 |
||||
NextBankButton: -1 |
||||
PrevBankButton: -1 |
||||
LockButton: -1 |
||||
|
||||
[MixerControls] |
||||
# Again enter the appropriate CCs for the respective controls. |
||||
# If all sliders use the global channel to send their data, |
||||
# you can leave the channels at -1. You can, of course, use |
||||
# encoders or knobs instead of sliders. |
||||
VolumeSlider1: -1 |
||||
VolumeSlider2: -1 |
||||
VolumeSlider3: -1 |
||||
VolumeSlider4: -1 |
||||
VolumeSlider5: -1 |
||||
VolumeSlider6: -1 |
||||
VolumeSlider7: -1 |
||||
VolumeSlider8: -1 |
||||
Slider1Channel: -1 |
||||
Slider2Channel: -1 |
||||
Slider3Channel: -1 |
||||
Slider4Channel: -1 |
||||
Slider5Channel: -1 |
||||
Slider6Channel: -1 |
||||
Slider7Channel: -1 |
||||
Slider8Channel: -1 |
||||
MasterVolumeSlider: -1 |
||||
MasterSliderChannel: -1 |
||||
Send1Knob1: -1 |
||||
Send1Knob2: -1 |
||||
Send1Knob3: -1 |
||||
Send1Knob4: -1 |
||||
Send1Knob5: -1 |
||||
Send1Knob6: -1 |
||||
Send1Knob7: -1 |
||||
Send1Knob8: -1 |
||||
Send2Knob1: -1 |
||||
Send2Knob2: -1 |
||||
Send2Knob3: -1 |
||||
Send2Knob4: -1 |
||||
Send2Knob5: -1 |
||||
Send2Knob6: -1 |
||||
Send2Knob7: -1 |
||||
Send2Knob8: -1 |
||||
TrackArmButton1: -1 |
||||
TrackArmButton2: -1 |
||||
TrackArmButton3: -1 |
||||
TrackArmButton4: -1 |
||||
TrackArmButton5: -1 |
||||
TrackArmButton6: -1 |
||||
TrackArmButton7: -1 |
||||
TrackArmButton8: -1 |
||||
VolumeMapMode: Absolute |
||||
SendsMapMode: Absolute |
||||
|
||||
[TransportControls] |
||||
# The transport buttons are also expected not to be toggles. |
||||
StopButton: -1 |
||||
PlayButton: -1 |
||||
RecButton: -1 |
||||
LoopButton: -1 |
||||
RwdButton: -1 |
||||
FfwdButton: -1 |
||||
|
||||
|
@ -0,0 +1,92 @@ |
||||
//needs debouncing and investigation of pin 0
|
||||
|
||||
#include <MIDIUSB.h> |
||||
|
||||
static const int matrixInPins[] = {1, 0, 2, 3, 4, 5, 6, 7}; //x
|
||||
static const int matrixOutPins[] = {8, 9, 10, 16, 14, 15, 18}; //y
|
||||
int channel = 1; |
||||
int midiNotes[7][8] = { |
||||
// 1 0 2 3 4 5 6 7
|
||||
{ 0, 0, 76, 69, 80, 70, 83, 45}, //8
|
||||
{ 0, 0, 77, 0, 82, 0, 73, 0}, //9
|
||||
{ 0, 0, 0, 49, 0, 0, 0, 0}, //10
|
||||
{ 0, 0, 51, 0, 46, 0, 48, 47}, //16
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 52}, //14
|
||||
{24, 22, 79, 0, 81, 0, 75, 50}, //15
|
||||
{25, 23, 78, 71, 0, 72, 74, 84} //18
|
||||
}; |
||||
int noteToSend = 0; |
||||
int noteSent = 0; |
||||
int noteToStop = 0; |
||||
int noteStopped = 0; |
||||
int scanIn; |
||||
int scanOut; |
||||
|
||||
void setup() { |
||||
Serial1.end(); |
||||
for (int i = 0; i < sizeof(matrixInPins); ++i) |
||||
pinMode(matrixInPins[i], INPUT_PULLUP); |
||||
for (int i = 0; i < sizeof(matrixOutPins); ++i) { |
||||
pinMode(matrixOutPins[i], OUTPUT); |
||||
digitalWrite(matrixOutPins[i], HIGH); |
||||
} |
||||
} |
||||
|
||||
void scan() { |
||||
for (scanOut = 0; scanOut < 7; ++scanOut) { |
||||
digitalWrite(matrixOutPins[scanOut], LOW); |
||||
for (scanIn = 0; scanIn < 8; ++scanIn) { |
||||
if (digitalRead(matrixInPins[scanIn]) == LOW) { |
||||
//Serial.print(matrixInPins[scanIn]);
|
||||
//Serial.print(":");
|
||||
//Serial.println(matrixOutPins[scanOut]);
|
||||
noteToSend = midiNotes[scanOut][scanIn]; |
||||
//Serial.println(noteToSend);
|
||||
sendNote(); |
||||
} |
||||
if (digitalRead(matrixInPins[scanIn]) == HIGH && midiNotes[scanOut][scanIn] == noteSent) { |
||||
noteToStop = noteSent; |
||||
stopNote(); |
||||
} |
||||
} |
||||
digitalWrite(matrixOutPins[scanOut], HIGH); |
||||
} |
||||
} |
||||
void sendNote() { |
||||
if (noteToSend != noteSent) { |
||||
noteOn(channel, noteToSend, 64); |
||||
MidiUSB.flush(); |
||||
noteSent = noteToSend; |
||||
} |
||||
} |
||||
void stopNote() { |
||||
if (noteToStop != noteStopped) { |
||||
noteOff(channel, noteToStop, 64); |
||||
//allNotesOff(channel, noteToStop, 64);
|
||||
//controlChange(123, 0, channel);
|
||||
MidiUSB.flush(); |
||||
noteStopped = noteToStop; |
||||
noteToStop = 0; |
||||
noteToSend = 0; |
||||
noteSent = 0; |
||||
} |
||||
} |
||||
|
||||
void noteOn(byte channel, byte pitch, byte velocity) { |
||||
midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity}; |
||||
MidiUSB.sendMIDI(noteOn); |
||||
} |
||||
|
||||
void noteOff(byte channel, byte pitch, byte velocity) { |
||||
midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity}; |
||||
MidiUSB.sendMIDI(noteOff); |
||||
} |
||||
|
||||
void controlChange(byte channel, byte control, byte value) { |
||||
midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value}; |
||||
MidiUSB.sendMIDI(event); |
||||
} |
||||
|
||||
void loop() { |
||||
scan(); |
||||
} |
Loading…
Reference in new issue