Converter números de nota MIDI Para Nome e Octave
Pergunta
Alguém sabe de tudo o que existe no mundo Java para mapear números de notas MIDI para nomes da nota específicos e números de oitava. Por exemplo, consulte a tabela de referência:
http://www.harmony-central.com/MIDI/Doc/ table2.html
Eu quero mapear um número da nota MIDI 60 a ele é nome da nota (middlec) correspondente na oitava 4. Eu poderia escrever uma classe de utilitário / enum para isso, mas seria um pouco entediante. Alguém sabe de alguma coisa?
Eu estou usando especificamente esse para escrever um clone Tenori-On / Monome em Java, até aí tudo bem ...
Solução
Este foi o que eu acabei usando:
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];
Solução
Eu não estou convencido de que sua sugestão é que tedioso. É realmente apenas uma operação de divisão e de módulo, tem-se a oitava, o outro recebe a nota.
octave = int (notenum / 12) - 1;
note = substring("C C#D D#E F F#G G#A A#B ",(notenum % 12) * 2, 2);
No setor Java, ao contrário do que pseudo-código acima, você pode usar algo como:
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);
}
}
}
Outras dicas
Na JFugue , a classe Note
tem um método utilitário que faz exatamente isso -. Ver public static String getStringForNote(byte noteValue)
EDIT: Como de JFugue 5.0 e posterior, a classe Note
tem vários métodos utilidade para conseguir uma representação de cadeia de um valor de nota MIDI:
-
getToneString(byte noteValue)
converte um valor de60
aoC5
corda -
getToneStringWithoutOctave(byte noteValue)
converte um valor de60
para a cadeiaC
-
getPercussionString(byte noteValue)
converte um valor da60
ao"[AGOGO]"
corda
Estes substituem o método getStringForNote()
originais.
public static String getNoteName(int noteNumber){
noteNumber -= 21; // see the explanation below.
String[] notes = new String[] {"A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#"};
int octave = noteNumber / 12 + 1;
String name = notes[noteNumber % 12];
return name + octave;
}
Explicação:
-
A0 em midi é a primeira observação e o seu número é de 21. Nós ajustar o índice de começar a partir de 0 (daí
noteNumber -= 21;
no início). Se os seus números de notas são 0 com base, por exemplo, o piano 0-88, então você pode comentar esta linha fora. -
Note-se que nesta solução, os nomes da nota no início matriz de A a G.
-
Octave é
noteNumber / 12 + 1
(ou teto de num / 12). - índice nome da nota é
noteNumber % 12
.