2009-04-03 19 views
11

कनवर्ट करें क्या किसी को जावा दुनिया में मौजूद कुछ भी पता है जो मिडी नोट संख्याओं को विशिष्ट नोट नामों और ऑक्टेटिव संख्याओं में मैप करने के लिए करता है। उदाहरण के लिए, संदर्भ तालिका देखें:मिडी नोट नंबर को नाम और ऑक्टेव

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

मैं इसे करने के लिए एक मिडी नोट संख्या 60 मैप करना चाहते हैं इसी टिप्पणी नाम (MiddleC) है सप्तक 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]; 
+0

जॉन, मैंने अपने उत्तर में कुछ वास्तविक जावा जोड़ा। – paxdiablo

+0

भयानक, पॉइंटर्स के लिए धन्यवाद ... – Jon

उत्तर

11

मुझे विश्वास नहीं है कि आपका सुझाव है थकाऊ। यह वास्तव में सिर्फ एक विभाजित और मॉड्यूलो ऑपरेशन है, एक को ऑक्टेट मिल जाता है, दूसरा नोट प्राप्त करता है।

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

असली जावा में, जैसा कि ऊपर है कि छद्म कोड के लिए विरोध किया है, तो आप की तरह कुछ का उपयोग कर सकते हैं:

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

शायद जॉन हर एक नोट + ऑक्टेटिव संयोजन के लिए एक enum बनाने की सोच रहा था? – Smashery

+0

वह प्रारंभिक पागल सुझाव था। मैं एल्गोरिदम की तलाश में था ... मुझे यकीन है कि मैं इसे कुछ बाहर कर सकता हूं, मुझे नहीं लगता कि यह जावा में मान्य है ... अनुवाद करने में लंबा समय नहीं लेना चाहिए ... – Jon

+0

इसके अलावा, शायद कोई उम्मीद कर सकता है एक आंतरिक कॉम के लिए। .Midi, जावा के साथ "जहाजों", जिसमें ऐसी विधि शामिल है। हालांकि, यह अभी भी एक नोट (61?) सी # या डीबी कॉल करने के लिए अनसुलझा छोड़ देगा। अगर किसी के पास एक महत्वपूर्ण हस्ताक्षर होता है, तो कोई व्यक्ति उस हस्ताक्षर के अनुसार (कई मामलों के लिए) हल कर सकता है। आई, बी की कुंजी के लिए, यह सी # होगा। जीबी की कुंजी के लिए यह डीबी होगा। –

2

JFugue में, Note वर्ग एक उपयोगिता विधि है कि वास्तव में यह करता है - public static String getStringForNote(byte noteValue) देखना ।

संपादित करें: JFugue 5.0 के रूप में और बाद में, Note वर्ग एक MIDI नोट मूल्य से एक स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए कई उपयोगिता तरीकों है:

  • getToneString(byte noteValue) स्ट्रिंग C5 को 60 के एक मूल्य धर्मान्तरित
  • getToneStringWithoutOctave(byte noteValue) स्ट्रिंग C
  • getPercussionString(byte noteValue) करने के लिए 60 के एक मूल्य धर्मान्तरित स्ट्रिंग "[AGOGO]"

ये मूल getStringForNote() विधि को बदलने के लिए 60 के मूल्य बदल देता है।

+0

दिलचस्प। ऐसा लगता है कि jfugue 5 में अब 'org.jfugue.Note' है। इसमें 'org.jfugue.theory.Note' है लेकिन उसमें ऐसा लगता है कि 'getStringForNote' विधि नहीं है।निश्चित नहीं है कि लोग उपयोगी कार्यक्षमता को दूर करने का फैसला क्यों करते हैं (विशेष रूप से जब इसकी लागत अधिक नहीं थी) हालांकि यह हो सकता है कि वे इसे कहीं और स्थानांतरित कर दें, न कि मुझे यह मिल सके :-) – paxdiablo

+0

दरअसल, नया नोट क्लास में पुराने संस्करण की तुलना में कई और उपयोगिता कार्य हैं। नया getStringForNote प्राप्त हो रहा है टोनस्ट्रिंग (बाइट नोट वैल्यू) - 60 के मान के लिए, यह "सी 5" वापस आ जाएगा। अब टोनस्ट्रिंगविथआउटऑक्टेव (बाइट नोटवैल्यू) भी मिल जाएगा, जो 60 के लिए "सी" वापस कर देगा। आप getPercussionString (बाइट नोटवैल्यू) भी पा सकते हैं, जो 60 के लिए "[AGOGO]" लौटाएगा। नई विधियां मूल से अधिक समृद्ध हैं, और उनके उद्देश्य को स्पष्ट करने के लिए नए फ़ंक्शन नामों की आवश्यकता है। –

संबंधित मुद्दे