如题,就是在android实现可以自己设定他播放的音调,如音乐中do,rui,mi,fa,so,la,xi,dou。
搜了很久没看到,发现ToneGenerator有类似功能,但不能实现自定义相应的音调。

解决方案 »

  1.   


        private final int    duration    = 1; // seconds
        private final int    sampleRate  = 8000;
        private final int    numSamples  = duration * sampleRate;
        private final double sample[] = new double[numSamples];
        private final double freqOfTone[] ={262, 294,330,349,392,440,494,524}; // do,rui,mi,fa,so,la,xi,dou的频率
        private final byte   generatedSnd[] = new byte[2 * numSamples];
                private int          freqCnt=0;  
      class PlayThread extends Thread
      {
        private int  playfreq;//播放频率 
     public PlayThread(int cnt)
     {
    playfreq=cnt%8;
     }


    @Override
    public void run() {
    // TODO Auto-generated method stub       for (int i = 0; i < numSamples; ++i) {
              sample[i] = Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone[playfreq]));
          }
          int idx = 0;
          for (final double dVal : sample) {
              // scale to maximum amplitude
              final short val = (short) ((dVal * 32767));
              // in 16 bit wav PCM, first byte is the low order byte
              generatedSnd[idx++] = (byte) (val & 0x00ff);
              generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
          }
        
        
         final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                  sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
                  AudioFormat.ENCODING_PCM_16BIT, numSamples,
                  AudioTrack.MODE_STATIC);
         audioTrack.write(generatedSnd, 0, generatedSnd.length);
         audioTrack.play();
      super.run();
    }   
      }  调用   new PlayThread(0).start();  //0播发duo  1播放rui 2播放mi ......我试过了 可以