День добрый!
По заданию необходимо создать мидлет, который воспроизводит тональную последовательность заданной музыкальной композиции (в моем случае, это "5 симфония Бетховена"). Муз. композиция задана в формате RTTL, и чтобы ее вопроизвести в мидлете, необходимо коды RTTL перегнать в массив нот.
Вот сама RTTL последовательность:
Код | d=16, 0=5, b=100: g,g,g,4d#,4p,f,f,f,4d,4p,g,g,g,d#,g#,g#,g#,g,d#6,d#6,d#6,4c6,8p,g,g,g,g#,g#,g#,g,f6,f6,f6,4d6,8p,g6,g6,f6,4d#6,8p,g6,g6,f6,4d#6
|
Скажу сразу, что я не знаю, как формировать октаву =( (это то, что идет после знака решетки). Нашел следующее:
Код | "0" | Нота A = 440 Герц (самая низкая октава) "1" | Нота A = 880 Герц "2" | Нота A = 1.76 КилоГерц "3" | Нота A = 3.52 КилоГерц (самая высокая октава) "4" | Нота A = 440 Герц (самая низкая октава) "5" | Нота A = 880 Герц "6" | Нота A = 1.76 КилоГерц "7" | Нота A = 3.52 КилоГерц (самая высокая октава)
|
но как это применить, не знаю. Ведь нота в массиве определяется парой значений, которые задают высоту и длительность звучания. Но про октаву ничего не сказано.
И так, вот что у меня получилось:
Код | private void playMusic() { byte p = ToneControl.SILENCE; byte C4 = ToneControl.C4; // до byte C4d = (byte)(C4 + 1); // до-диез byte D4 = (byte)(C4 + 2); // ре byte D4d = (byte)(C4 + 3); // ре-диез byte E4 = (byte)(C4 + 4); // ми byte F4 = (byte)(C4 + 5); // фа byte F4d = (byte)(C4 + 6); // фа-диез byte G4 = (byte)(C4 + 7); // соль byte G4d = (byte)(C4 + 8); // соль-диез byte A4 = (byte)(C4 + 9); // ля byte A4d = (byte)(C4 + 10); // ля-диез byte B4 = (byte)(C4 + 11); //си byte C5 = (byte)(C4 + 12); // до
byte[] nots = { ToneControl.VERSION, 1, ToneControl.TEMPO, 100, ToneControl.BLOCK_START, 0, G4,1,G4,1,G4,1, ToneControl.BLOCK_END, 0, ToneControl.PLAY_BLOCK, 0, D4d,4,p,4,F4,1,F4,1,F4,1,D4,4,p,4, ToneControl.PLAY_BLOCK, 0, D4d,1, ToneControl.BLOCK_START, 1, G4d,1,G4d,1,G4d,1, ToneControl.BLOCK_END, 1, ToneControl.PLAY_BLOCK, 1, G4,1, ToneControl.BLOCK_START, 2, D4d,6,D4d,6,D4d,6, ToneControl.BLOCK_END, 2, ToneControl.PLAY_BLOCK, 2, C4,4,p,8, ToneControl.PLAY_BLOCK, 0, D4,1, ToneControl.PLAY_BLOCK, 1, G4,1,F4,1,F4,1,F4,1,D4,4,p,8,G4,1,G4,1,F4,1,D4d,4,p,8,G4,1,G4,1,F4,1,D4d,4 };
try { player = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR); player.realize(); tone_control = (ToneControl) player.getControl("ToneControl"); tone_control.setSequence(nots); player.start(); } catch(java.io.IOException ioe) {System.out.println(ioe.getMessage());} catch(MediaException me){} }
|
При попытки запустить мидлет, выскакивает следующее исключение:
Код | TRACE: <at java.lang.IllegalArgumentException: Tone sequence check failed at offset 34: invalid sequence event '-5'>, Exception caught in Display class java.lang.IllegalArgumentException: Tone sequence check failed at offset 34: invalid sequence event '-5'
|
Начал тестировать и искать место, от куда начинает появляться исключение, и в итоге определил, что с места ToneControl.BLOCK_START, 1,. До этого места мелодия худо бедно проигрывается.
Я так пока и не знаю, в чем может быть ошибка. Может вы мне подскажите? Буду благодарен. |