92 lines
4.9 KiB
C
92 lines
4.9 KiB
C
#pragma once
|
|
#include "tuning.h"
|
|
|
|
struct Fingering {
|
|
Note note;
|
|
bool alt; // Alternate fingering: sounds more choked
|
|
};
|
|
|
|
#define n(note) \
|
|
{ note, false }
|
|
#define P(note) \
|
|
{ note, true }
|
|
|
|
#define CCCC n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_Cs5)
|
|
#define CCDD n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_D5), n(NOTE_D5)
|
|
#define CDCD n(NOTE_Cs5), n(NOTE_D5), n(NOTE_Cs5), n(NOTE_D5)
|
|
#define DDDD n(NOTE_D5), n(NOTE_D5), n(NOTE_D5), n(NOTE_D5)
|
|
|
|
struct Fingering uilleann_matrix[] = {
|
|
// Open Back D
|
|
n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_D5), // OOO OO..
|
|
CCDD, // OOO OX..
|
|
CDCD, // OOO XO..
|
|
DDDD, // OOO XX..
|
|
CDCD, // OOX OO..
|
|
DDDD, // OOX OX..
|
|
CDCD, // OOX XO..
|
|
DDDD, // OOX XX..
|
|
CCDD, // OXO OO..
|
|
CCDD, // OXO OX..
|
|
DDDD, // OXO XO..
|
|
DDDD, // OXO XX..
|
|
DDDD, // OXX OO..
|
|
DDDD, // OXX OX..
|
|
DDDD, // OXX XO..
|
|
DDDD, // OXX XX..
|
|
CDCD, // XOO OO..
|
|
DDDD, // XOO OX..
|
|
CDCD, // XOO XO..
|
|
DDDD, // XOO XX..
|
|
CDCD, // XOX OO..
|
|
DDDD, // XOX OX..
|
|
CDCD, // XOX XO..
|
|
DDDD, // XOX XX..
|
|
DDDD, // XXO OO..
|
|
DDDD, // XXO OX..
|
|
DDDD, // XXO XO..
|
|
DDDD, // XXO XX..
|
|
DDDD, // XXX OO..
|
|
DDDD, // XXX OX..
|
|
n(NOTE_D5), n(NOTE_D5), n(NOTE_D5), P(NOTE_D5), // XXX XO..
|
|
DDDD, // XXX XX..
|
|
|
|
// Closed Back D
|
|
CCCC, // OOO OO...
|
|
n(NOTE_Cs5), n(NOTE_Cs5), n(NOTE_Cs5), P(NOTE_Cs5), // OOO OX..
|
|
CCCC, // OOO XO..
|
|
CCCC, // OOO XX..
|
|
CCCC, // OOX OO..
|
|
n(NOTE_Cs5), P(NOTE_Cs5), n(NOTE_Cs5), P(NOTE_Cs5), // OOX OX..
|
|
CCCC, // OOX XO..
|
|
CCCC, // OOX XX..
|
|
CCCC, // OXO OO..
|
|
n(NOTE_Cs5), P(NOTE_Cs5), n(NOTE_Cs5), P(NOTE_Cs5), // OXO OX..
|
|
CCCC, // OXO XO..
|
|
CCCC, // OXO XX..
|
|
P(NOTE_C5), P(NOTE_C5), P(NOTE_C5), P(NOTE_C5), // OXX OO..
|
|
n(NOTE_C5), n(NOTE_C5), n(NOTE_C5), n(NOTE_C5), // OXX OX..
|
|
n(NOTE_C5), n(NOTE_C5), n(NOTE_C5), P(NOTE_C5), // OXX XO..
|
|
n(NOTE_C5), n(NOTE_C5), n(NOTE_C5), n(NOTE_Cs5), // OXX XX..
|
|
n(NOTE_B4), n(NOTE_B4), n(NOTE_B4), n(NOTE_B4), // XOO OO..
|
|
P(NOTE_B4), P(NOTE_B4), n(NOTE_B4), P(NOTE_B4), // XOO OX..
|
|
n(NOTE_As4), n(NOTE_B4), n(NOTE_As4), n(NOTE_B4), // XOO XO..
|
|
n(NOTE_B4), n(NOTE_B4), n(NOTE_B4), n(NOTE_B4), // XOO XX..
|
|
P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), // XOX OO..
|
|
P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), // XOX OX..
|
|
P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), // XOX XO..
|
|
P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), P(NOTE_B4), // XOX XX..
|
|
n(NOTE_A4), n(NOTE_A4), P(NOTE_A4), n(NOTE_A4), // XXO OO..
|
|
P(NOTE_A4), P(NOTE_A4), P(NOTE_A4), P(NOTE_A4), // XXO OX..
|
|
n(NOTE_Gs4), P(NOTE_Gs4), n(NOTE_A4), n(NOTE_A4), // XXO XO..
|
|
P(NOTE_A4), P(NOTE_A4), P(NOTE_A4), n(NOTE_A4), // XXO XX..
|
|
n(NOTE_G4), n(NOTE_G4), P(NOTE_G4), n(NOTE_G4), // XXX OO..
|
|
P(NOTE_G4), P(NOTE_G4), P(NOTE_G4), P(NOTE_G4), // XXX OX..
|
|
n(NOTE_Fs4), n(NOTE_Fs4), n(NOTE_F4), P(NOTE_Fs4), // XXX XO..
|
|
n(NOTE_E4), P(NOTE_E4), n(NOTE_Ds4), n(NOTE_D4), // XXX XX..
|
|
};
|
|
|
|
inline Fingering FingeredNote(uint16_t keys) {
|
|
return uilleann_matrix[keys & 0xff];
|
|
}
|