Java midi note для сопоставления строк через октаву ноты - PullRequest
1 голос
/ 19 февраля 2012

В моем проекте я хочу по крайней мере проинформировать пользователя о том, на какой строке находится нота, которую он должен сыграть. Я могу получить ноту и ее октаву, но, как я обнаружил, эта нота и ее октава могут появляться в нескольких местах на грифовой доске гитары.

Итак, мой вопрос: есть ли способ сопоставить ноту миди с гитарной струной?

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Вот код, который принимает значение ноты MIDI и возвращает позицию на грифе гитары, ближайшую к концу инструмента. Лада ноль является открытой строкой.

static class Fingering {
    int string;
    int fret;

    public String toString() {
        return "String : " + stringNames[string] + ", fret : " + fret;
    }
}

static String[] stringNames = new String[] {"Low E", "A", "D", "G", "B", "High E"}; 

    /** Array showing guitar string's relative pitches, in semi-tones, with "0" being low E */
static int[] strings = new int[]{64, 69, 74, 79, 83, 88};



public static Fingering getIdealFingering(int note) {
            if (note < strings[0])
                throw new RuntimeException("Note " + note + " is not playable on a guitar in standard tuning.");

    Fingering result = new Fingering();

    int idealString = 0;
    for (int x = 1; x < strings.length; x++) {
        if (note < strings[x])
            break;
        idealString = x; 
    }

    result.string = idealString;
    result.fret = note - strings[idealString];

    return result;
}

public static void main(String[] args) {
    System.out.println(getIdealFingering(64));  // Low E
    System.out.println(getIdealFingering(66));  // F#
    System.out.println(getIdealFingering(72));  // C on A string
    System.out.println(getIdealFingering(76));  // E on D string
    System.out.println(getIdealFingering(88));  // guitar's high e string, open
    System.out.println(getIdealFingering(100)); // high E, 12th fret
    System.out.println(getIdealFingering(103)); // high G
}

Результат:

String : Low E, fret : 0
String : Low E, fret : 2
String : A, fret : 3
String : D, fret : 2
String : High E, fret : 0
String : High E, fret : 12
String : High E, fret : 15
0 голосов
/ 20 февраля 2012

Думайте о MIDI как об определении клавиш пианино.Коды и ключи один на один.Это не похоже на гитару или скрипку, где один и тот же тон можно воспроизводить в нескольких местах.

Если вы хотите представить большую свободу, которую вы имеете на гитаре в каком-либо формате данных, вам придется найти илипридумать другой формат.MIDI не будет кодировать то, что вы хотите.

Тем не менее, есть косвенный способ, которым вы можете пойти по этому поводу, и он связан с развитием эвристики относительно того, где играть ноту, учитывая скользящее окно нот, которые пришлидо.Заданная нота может быть проще для той или иной струны, в зависимости от того, что вы только что сыграли, и вы можете рассчитать ее, исходя из модели руки и места, где были пальцы.Исходя из этого, вы можете конвертировать MIDI в гитару таким образом, чтобы MIDI было легче играть.Если у вас уже есть гитарная музыка, соответствующая этим правилам, вы можете кодировать ее в MIDI, а затем декодировать позже.

Но, возможно, ваш вопрос более простой.Да, вы можете сопоставить ноты MIDI с гитарой.Наивный метод состоит в том, чтобы сделать сопоставление каждой ноты, играемой на гитаре, и вы выбираете между эквивалентными альтернативами, выбирая ту, которая ближе всего к гайке.Это было бы простое сопоставление один-к-одному, но не обязательно было бы самым легким для воспроизведения.

Если вы действительно хотите сделать это правильно, вы сделаете тщательный анализ музыки, чтобы решить,Оптимальное положение руки и то, где положение руки должно измениться, и тогда вы будете ассоциировать ноты MIDI с ладами и струнами, основываясь на том, что легче всего достичь на основе положения руки.Оптимальное решение, вероятно, является NP-полным или хуже, возможно, вы захотите разработать приблизительное решение, основанное на некоторых правилах о том, как часто и как далеко вы можете менять положение руки.

0 голосов
/ 19 февраля 2012

Да, с простой логикой вы можете сделать это. Я хотел бы рассмотреть возможность использования HashMap со значением <Note, MidiNote>, где Note - это ваш класс, который содержит как относительную ноту, так и октаву и имеет достойные методы равенства и хэш-кода, а MidiNote - ваш класс для представления ноты Midi.

...