views:

977

answers:

2

Does anybody know of anything that exists in the Java world to map midi note numbers to specific note names and octave numbers. For example, see the reference table:

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

I want to map a midi note number 60 to it's corresponding note name (MiddleC) in octave 4. I could write a utility class/enum for this, but it would be rather tedious. Does anybody know of anything?

I'm specifically using this to write a Tenori-On/Monome clone in Java, so far so good...

Solution

This was what I ended up using:

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];
+4  A: 

How is that tedious? It's really just a divide-and-modulo operation, one gets the octave, the other gets the note.

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

In real Java, as opposed to that pseudo-code above:

public class Notes {
    public static void main (String [] args) {
        String notes = "C C#D D#E F F#G G#A A#B ";
        int octave;
        String note;
        for (int noteNum = 0; noteNum < 128; noteNum++) {
            octave = noteNum / 12 - 1;
            note = notes.substring(
                (noteNum % 12) * 2,
                (noteNum % 12) * 2 + 2);
            System.out.println (
                "Note number " + noteNum +
                " is octave " + octave +
                " and note " + note);
        }
    }
}
paxdiablo
Perhaps Jon was thinking of creating an enum for every single note+octave combination?
Smashery
That was the initial crazy suggestion. I was looking for the algorithm... I'm sure I can work something out given this, I don't think it's valid in Java... shouldn't take long to translate...
Jon
+2  A: 

In JFugue, the Note class has a utility method that does exactly this - see public static String getStringForNote(byte noteValue).

David