marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (11) トーン

2008年09月23日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (11) トーン

■ 音を鳴らす

トーンを使って、音を鳴らすことができます。これには、周波数、持続
時間、音量を指定する playTone メソッドを使います。このメソッドは、
playSample メソッドと違い、pause メソッドを使って音を鳴らす時間
を指定しなければなりません。

------------------------------------------------------
import lejos.nxt.Sound;

/**
 * PlayingMusic01.nxc
 * 「トライボット」使用
 * 音を鳴らす。
 * @author maruno
 * @version 1.0, 2008-01-12
 * @since 1.0
 */
public class PlayingMusic01 {

    public static void main(String[] args) {

        Sound.setVolume(40);    // (1)

        // 音階6 を B から C まで
        Sound.playTone(1976, 400); Sound.pause(500);    // (2)
        Sound.playTone(1865, 400); Sound.pause(500);
        Sound.playTone(1760, 400); Sound.pause(500);
        Sound.playTone(1661, 400); Sound.pause(500);
        Sound.playTone(1568, 400); Sound.pause(500);
        Sound.playTone(1480, 400); Sound.pause(500);
        Sound.playTone(1397, 400); Sound.pause(500);
        Sound.playTone(1319, 400); Sound.pause(500);
        Sound.playTone(1245, 400); Sound.pause(500);
        Sound.playTone(1175, 400); Sound.pause(500);
        Sound.playTone(1109, 400); Sound.pause(500);
        Sound.playTone(1047, 400); Sound.pause(500);
    }
}
------------------------------------------------------


□ Sound.setVolume(40); // (1)

音量を 40 に設定します。


□ Sound.playTone(1976, 400); Sound.pause(500); // (2)


周波数 1976、持続時間 400 ミリ秒でトーンを鳴らします。
ただし、このメソッドも、すぐにつぎの命令を実行してしまうので、
pause メソッドを使ってスリープ状態を作ってあげなければなりません。
多少、持続時間に余裕を持たせてあげた方がいいでしょう。


□ 周波数はつぎの表によります。

ただし、この表は NXC のマニュアルから持ってきたもので、leJOS の
API には書かれていませんので、この値でいいかどうかはわかりません。
(★)

---
Sound  3   4   5   6    7    8    9
B     247 494 988 1976 3951 7902
A#    233 466 932 1865 3729 7458
A     220 440 880 1760 3520 7040 14080
G#        415 831 1661 3322 6644 13288
G         392 784 1568 3136 6272 12544
F#        370 740 1480 2960 5920 11840
F         349 698 1397 2794 5588 11176
E         330 659 1319 2637 5274 10548
D#        311 622 1245 2489 4978 9956
D         294 587 1175 2349 4699 9398
C#        277 554 1109 2217 4435 8870
C         262 523 1047 2093 4186 8372
---



■ 実際の音楽っぽく

つぎは、ある曲を実装したものです。
楽譜を基に実装したのだが、まったく違うものらしい。
わたしの楽譜の読み方が違うのか、周波数のトーンが間違っているのか
?
(中学の音楽は 1 がついたこともあったくらいなので...)

まずは、音階関係を定数にしておいたほうが使いやすいので、これらを
ユーティリティクラスとして作っておきます。

------------------------------------------------------
package u;

import lejos.nxt.Sound;

/**
 * 音関係のユーティリティのクラス
 * @author marunomaruno
 * @version 1.0, 2008/06/29
 * @since 1.0
 */
public class SoundUtil {

    /*
     * 周波数
     */
    public static int  FR_B3 = 247;
    public static int  FR_B4 = 494;
    public static int  FR_B5 = 988;
    public static int  FR_B6 = 1976;
    public static int  FR_B7 = 3951;
    public static int  FR_B8 = 7902;

    public static int  FR_AS3 = 233;
    public static int  FR_AS4 = 466;
    public static int  FR_AS5 = 932;
    public static int  FR_AS6 = 1865;
    public static int  FR_AS7 = 3729;
    public static int  FR_AS8 = 7458;

    public static int  FR_A3 = 220;
    public static int  FR_A4 = 440;
    public static int  FR_A5 = 880;
    public static int  FR_A6 = 1760;
    public static int  FR_A7 = 3520;
    public static int  FR_A8 = 7040;
    public static int  FR_A9 = 14080;

    public static int  FR_GS4 = 415;
    public static int  FR_GS5 = 831;
    public static int  FR_GS6 = 1661;
    public static int  FR_GS7 = 3322;
    public static int  FR_GS8 = 6644;
    public static int  FR_GS9 = 13288;

    public static int  FR_G4 = 392;
    public static int  FR_G5 = 784;
    public static int  FR_G6 = 1568;
    public static int  FR_G7 = 3136;
    public static int  FR_G8 = 6272;
    public static int  FR_G9 = 12544;

    public static int  FR_FS4 = 370;
    public static int  FR_FS5 = 740;
    public static int  FR_FS6 = 1480;
    public static int  FR_FS7 = 2960;
    public static int  FR_FS8 = 5920;
    public static int  FR_FS9 = 11840;

    public static int  FR_F4 = 349;
    public static int  FR_F5 = 698;
    public static int  FR_F6 = 1397;
    public static int  FR_F7 = 2794;
    public static int  FR_F8 = 5588;
    public static int  FR_F9 = 11176;

    public static int  FR_E4 = 330;
    public static int  FR_E5 = 659;
    public static int  FR_E6 = 1319;
    public static int  FR_E7 = 2637;
    public static int  FR_E8 = 5274;
    public static int  FR_E9 = 10548;

    public static int  FR_DS4 = 311;
    public static int  FR_DS5 = 622;
    public static int  FR_DS6 = 1245;
    public static int  FR_DS7 = 2489;
    public static int  FR_DS8 = 4978;
    public static int  FR_DS9 = 9956;

    public static int  FR_D4 = 294;
    public static int  FR_D5 = 587;
    public static int  FR_D6 = 1175;
    public static int  FR_D7 = 2349;
    public static int  FR_D8 = 4699;
    public static int  FR_D9 = 9398;

    public static int  FR_CS4 = 277;
    public static int  FR_CS5 = 554;
    public static int  FR_CS6 = 1109;
    public static int  FR_CS7 = 2217;
    public static int  FR_CS8 = 4435;
    public static int  FR_CS9 = 8870;

    public static int  FR_C4 = 262;
    public static int  FR_C5 = 523;
    public static int  FR_C6 = 1047;
    public static int  FR_C7 = 2093;
    public static int  FR_C8 = 4186;
    public static int  FR_C9 = 8372;

    /**
     * 全音符
     */
    public static int  NOTE_SEMIBREVE = 1200;
    /**
     * 二分音符
     */
    public static int  NOTE_MINIM     = (NOTE_SEMIBREVE / 2); 
    /**
     * 四分音符
     */
    public static int  NOTE_CROTCHET  = (NOTE_MINIM     / 2); 
    /**
     * 八分音符
     */
    public static int  NOTE_QUAVER    = (NOTE_CROTCHET  / 2); 

    /**
     * 指定周波数、持続時間でトーンを鳴らします。このとき、指定された間隔時間を鳴らした後に取ります。
     * @param frequency 周波数
     * @param duration 持続時間
     * @param interval 間隔時間
     */
    public static void playTone(int frequency, int duration, int interval) {
        Sound.playTone(frequency, duration); 
        Sound.pause(duration + interval);
    }
    
    /**
     * 指定周波数、持続時間、音量でトーンを鳴らします。このとき、指定された間隔時間を鳴らした後に取ります。
     * @param frequency 周波数
     * @param duration 持続時間
     * @param volume 音量
     * @param interval 間隔時間
     */
    public static void playTone(int frequency, int duration, int volume, int interval) {
        Sound.playTone(frequency, duration, volume); 
        Sound.pause(duration + interval);
    }
}
------------------------------------------------------



それでは、これを基に音を鳴らしてみましょう。

------------------------------------------------------
import lejos.nxt.Sound;
import u.SoundUtil;

/**
 * 「トライボット」使用
 * 音を鳴らす。
 * @author maruno
 * @version 1.0, 2008-06-29
 * @since 1.0
 */
public class PlayingMusic03 {

    public static void main(String[] args) {

        final int INTERVAL = 80;

        Sound.setVolume(40);

        SoundUtil.playTone(SoundUtil.FR_C6,  SoundUtil.NOTE_MINIM,    INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C5,  SoundUtil.NOTE_QUAVER,   INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C4,  SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C5,  SoundUtil.NOTE_CROTCHET, INTERVAL);
                           
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL + SoundUtil.NOTE_CROTCHET);
                           
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_CROTCHET, INTERVAL + SoundUtil.NOTE_CROTCHET);
                           
        SoundUtil.playTone(SoundUtil.FR_G6,  SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_G8,  SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_G8,  SoundUtil.NOTE_CROTCHET, INTERVAL + SoundUtil.NOTE_CROTCHET);
                           
        SoundUtil.playTone(SoundUtil.FR_C6,  SoundUtil.NOTE_MINIM,    INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C5,  SoundUtil.NOTE_QUAVER,   INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C4,  SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_C5,  SoundUtil.NOTE_CROTCHET, INTERVAL);
                           
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_AS6, SoundUtil.NOTE_CROTCHET, INTERVAL + SoundUtil.NOTE_CROTCHET);
                           
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_CROTCHET, INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_DS6, SoundUtil.NOTE_MINIM,    INTERVAL);
        SoundUtil.playTone(SoundUtil.FR_DS5, SoundUtil.NOTE_QUAVER,   INTERVAL);
                           
        SoundUtil.playTone(SoundUtil.FR_C4,  SoundUtil.NOTE_SEMIBREVE, INTERVAL);

    }
}
------------------------------------------------------



以上


最新の画像もっと見る

コメントを投稿