2012-02-19 4 views
1

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

Так что мой вопрос: есть ли все-таки карта миди-ноты на гитаре?

ответ

2

Вот код, который принимает значение ноты 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

Будет ли это работать с острыми нотами, а также является ли вход для getIdealFingering номером ноты миди? – JavaTime

+0

Я переписал его, чтобы использовать номера MIDI-нот. Он отлично поддерживает острые предметы или квартиры. Это зависит от вашего приложения, чтобы выяснить, является ли данный номер примечания резким или плоским, это просто думает в полутонах (или половину шагов, если вы предпочитаете). – cutchin

+0

Это кажется отличным, спасибо. У вас есть ссылка на миди-ноту на гитарную карту. Тот, который я, кажется, противоречит выводам вашей программы. Например, строка C на A, как примечание midi, это C октава 5, но выход вашей программы дает, где C октава 3 должна быть на гитаре. – JavaTime

0

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

+0

Но это не решает мою проблему, я не могу сопоставить миди записку гитарной струны, потому что нота может быть где-нибудь на гитаре - даже зная, что это октавное число. Например, E4 (E октава 4) появляется на гитарной пластинке 4 раза (5, включая открытую e на 1-й строке). – JavaTime

+1

Да, вы можете использовать это, чтобы решить вашу проблему. Гитарная нота - это просто базовая нота, увеличенная по позиции лада. Все, что вам нужно сделать, это дать вашему классу примечаний достойный метод приращения, тот, который умножает заметку разумно, - который знает, чтобы увеличить октаву после того, как была пройдена A-квартира (или где бы границы были? C возможно?) И затем выполните простую математику. Это не что иное, как базовая логика. –

0

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

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

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

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

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

+0

Да, я думал, что это будет что-то вроде этого. Забавно, что в этом году кто-то еще делает это очень глубоко, но мне не нужно быть по-настоящему точной, я верю, поэтому сопоставление от одного к одному, возможно, дорога для меня. – JavaTime

 Смежные вопросы

  • Нет связанных вопросов^_^