2009-04-03 15 views
11

Qualcuno sa di tutto ciò che esiste nel mondo Java per mappare numeri di note midi su nomi di nota specifici e numeri di ottava. Ad esempio, vedere la tabella di riferimento:Converti numeri di nota Midi per nome e ottava

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

voglio mappare un numero di nota MIDI 60 al suo corrispondente nome della nota (middlec) in ottava 4. potrei scrivere una classe di utilità/enum per questo, ma sarebbe piuttosto noioso Qualcuno sa qualcosa?

Sono in particolare usando questo per scrivere un clone di Tenori-On/Monome in Java, finora tutto bene ...

Soluzione

Questo era quello che ho finito per usare:

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, ho aggiunto del vero Java alla mia risposta. – paxdiablo

+0

fantastico, grazie per i suggerimenti ... – Jon

risposta

11

Non sono convinto che il tuo suggerimento sia quello noioso. In realtà è solo un'operazione divide e modulo, si ottiene l'ottava, l'altro riceve la nota.

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

Nel settore Java, al contrario di quella pseudo-codice di cui sopra, si può usare qualcosa di simile a:

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

Forse Jon stava pensando di creare un enum per ogni singola nota + combinazione di ottava? – Smashery

+0

Quello era il primo suggerimento folle. Stavo cercando l'algoritmo ... Sono sicuro di poter lavorare su qualcosa dato questo, non penso che sia valido in Java ... non dovrebbe richiedere molto tempo per tradurre ... – Jon

+0

Inoltre, forse si potrebbe sperare per una COM intrinseca . Midi, che "spedisce" con Java, che contiene un tale metodo. Tuttavia, rimarrebbe comunque irrisolto se chiamare una nota (61?) C# o Db. Se uno aveva una firma di chiave, uno poteva risolvere quello (per molti casi) secondo la firma di chiave. Ad esempio, per la chiave di B, sarebbe b C#. Per la chiave di Gb sarebbe Db. –

2

Nel JFugue, la classe Note ha un metodo di utilità che fa esattamente questo - vedi public static String getStringForNote(byte noteValue) .

EDIT: partire dal JFugue 5.0 e versioni successive, la classe Note ha diversi metodi di utilità per ottenere una rappresentazione di stringa di un valore di nota MIDI:

  • getToneString(byte noteValue) converte un valore di 60 alla stringa C5
  • getToneStringWithoutOctave(byte noteValue) converte un valore 60 alla stringa C
  • getPercussionString(byte noteValue) converte un valore di 60 alla stringa "[AGOGO]"

Questi sostituiscono il metodo originale getStringForNote().

+0

Interessante. Sembra che jFugue 5 non abbia più "org.jfugue.Note". Ha 'org.jfugue.theory.Note' ma sembra che non abbia il metodo' getStringForNote'.Non sono sicuro del motivo per cui le persone decidono di togliere funzionalità utili (soprattutto perché il costo non è così elevato) anche se potrebbe essere stato spostato altrove, non che io possa trovarlo comunque :-) – paxdiablo

+0

In realtà, il nuovo La classe Note ha molte più funzioni di utilità rispetto alla versione precedente. Il nuovo getStringForNote è getToneString (byte noteValue) - per un valore di 60, questo restituisce "C5". Ora c'è anche getToneStringWithoutOctave (byte noteValue), che restituirà "C" per 60. Puoi anche trovare getPercussionString (byte noteValue), che per 60 restituirà "[AGOGO]". I nuovi metodi sono più ricchi degli originali e richiedevano nuovi nomi di funzioni per chiarire il loro scopo. –