uilleann/fingering.h

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];
}