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];
Foi útil?

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 de 60 ao C5 corda
  • getToneStringWithoutOctave(byte noteValue) converte um valor de 60 para a cadeia C
  • getPercussionString(byte noteValue) converte um valor da 60 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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top