تحويل أرقام ميدي لاحظ إلى الاسم والأوكتاف
سؤال
هل يعرف أي شخص بأي شيء موجود في عالم Java لمصورة أرقام مذكرة MIDI لأسماء ملاحظة محددة وأرقام أوكتاف. على سبيل المثال، راجع الجدول المرجعي:
http://www.harmony-central.com/midi/doc/table2.html
أريد تعيين مذكرة MIDI رقم 60 إلى اسم الملاحظات المقابل (MIDDLEC) في Octave 4. يمكنني كتابة فئة فائدة / ENUM لهذا الغرض، ولكن سيكون مملا إلى حد ما. هل يعرف أي شخص بأي شيء؟
أنا على وجه التحديد باستخدام هذا لكتابة استنساخ Tenori-On / Monome في جافا، حتى الآن جيدة جدا ...
المحلول
كان هذا ما انتهى به باستخدام:
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];
المحلول
أنا غير مقتنع اقتراحك هو الذي - التي مضجر. انها حقا مجرد عملية تقسيم ومودولو، يحصل المرء على اوكتاف، والآخر يحصل على الملاحظة.
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);
}
}
}
نصائح أخرى
في 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()
طريقة.
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;
}
تفسير:
A0 في MIDI هي الملاحظة الأولى ورقمها هو 21. نقوم بضبط الفهرس للبدء من 0 (وبالتالي
noteNumber -= 21;
في البداية). إذا كانت أرقام ملاحظتك هي 0، على سبيل المثال في البيانو من 0 إلى 88، يمكنك التعليق على هذا الخط.لاحظ أنه في هذا الحل، تبدأ أسماء الملاحظات في الصفيف من A إلى G.
اوكتاف
noteNumber / 12 + 1
(أو سقف عدد / 12).- ملاحظة اسم الاسم هو
noteNumber % 12
.