2009-04-03 3 views
11

Кто-нибудь знает что-либо, что существует в мире Java, чтобы отображать номера нот миди для конкретных имен заметок и октавных чисел. Например, см справочную таблицу:Convert Midi Note Numbers To Name and Octave

http://www.harmony-central.com/MIDI/Doc/table2.html

Я хочу отобразить миди номер ноты 60 в это соответствующее название ноты (MiddleC) в октаве 4. Я мог бы написать утилиту класс/перечисление для этого, но это было бы довольно утомительно. Кто-нибудь знает что-нибудь?

Я специально использую это, чтобы написать клон Tenori-On/Monome в Java, до сих пор так хорошо ...

Решение

Это было то, что я в конечном итоге с помощью:

String[] noteString = new String[] { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; 

int octave = (initialNote/12) - 1; 
int noteIndex = (initialNote % 12); 
String note = noteString[noteIndex]; 
+0

Jon, я добавил к Java настоящий Java. – paxdiablo

+0

awesome, спасибо за указатели ... – Jon

ответ

11

Я не уверен, что ваше предложение , что утомительно. Это действительно просто операция с делением и модулем, одна получается октавой, другая - запиской.

octave = int (notenum/12) - 1; 
note = substring("C C#D D#E F F#G G#A A#B ",(notenum % 12) * 2, 2); 

В реальной Java, в отличие от этого псевдо-кода выше, вы можете использовать что-то вроде:

public class Notes { 
    public static void main(String [] args) { 
    String notes = "C C#D D#E F F#G G#A A#B "; 
    int octv; 
    String nt; 
    for (int noteNum = 0; noteNum < 128; noteNum++) { 
     octv = noteNum/12 - 1; 
     nt = notes.substring((noteNum % 12) * 2, (noteNum % 12) * 2 + 2); 
     System.out.println("Note # " + noteNum + " = octave " + octv + ", note " + nt); 
    } 
    } 
} 
+0

Возможно, Джон думал о создании переименования для каждой комбинации с одной нотой + октавой? – Smashery

+0

Это было начальное сумасшедшее предложение. Я искал алгоритм ... Я уверен, что могу что-то сделать, учитывая это, я не думаю, что это действительно на Java ... не стоит долго переводить ... – Jon

+0

Также, возможно, можно было бы надеяться для внутреннего com. .Midi, который «отправляет» Java, который содержит такой метод. Тем не менее, он все равно оставит нерешенным вопрос о том, следует ли называть записку (61?) C# или Db. Если у вас была ключевая подпись, можно было бы разрешить это (для многих случаев) в соответствии с ключевой сигнатурой. I.e., для ключа B, это будет b C#. Для ключа Gb это будет Db. –

2

В JFugue, то Note класс имеет служебный метод, который делает именно это - см public static String getStringForNote(byte noteValue) ,

РЕДАКТИРОВАТЬ: По состоянию JFugue 5.0 и более поздние Note класса имеет несколько сервисных методов для получения строкового представления от значения MIDI-ноты:

  • getToneString(byte noteValue) преобразует значение 60 к строке C5
  • getToneStringWithoutOctave(byte noteValue) преобразует значение 60 в строку C
  • getPercussionString(byte noteValue) преобразует значение 60 к строке "[AGOGO]"

Они заменить оригинальный метод getStringForNote().

+0

Интересно. Похоже, что у jFugue 5 больше нет 'org.jfugue.Note'. Он имеет 'org.jfugue.theory.Note', но похоже, что у него нет метода getStringForNote'.Не уверен, почему люди решили убрать полезную функциональность (тем более, что стоимость этого не была такой высокой), хотя, возможно, они перемещены в другое место, но я не мог найти ее :-) – paxdiablo

+0

На самом деле, новый Класс Note имеет несколько функций полезности, чем более старая версия. Новый getStringForNote - getToneString (byte noteValue) - для значения 60, это вернет «C5». Теперь есть также getToneStringWithoutOctave (byte noteValue), который вернет «C» на 60. Вы также можете найти getPercussionString (byte noteValue), который за 60 вернет «[AGOGO]». Новые методы более богаты, чем оригиналы, и требуют новых имен функций, чтобы прояснить их цель. –