سؤال

هل يعرف أي شخص بأي شيء موجود في عالم 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top