注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

千鸟

本blog所有日志均系原创 转载请注明出处

 
 
 

日志

 
 

java 音效,笔记2  

2007-04-24 21:53:45|  分类: J2SE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

上篇<java 音效,笔记1> ,呵呵,老远的东西了.没时间搞.最近空了点,把老货继续拿来炒.上个代码只是能播放基本的声音,下面扩展上一个代码的功能. 扩张后的代码还真的不少,拣重点的贴出来.要全部代码的留下e-mail.

1.实现循环播放.

   从ByteArrayInputStream 派生子类. 覆盖ByteArrayInputStream 的read()方法.

/*

offset 起始位置,length要读取的最大字节数,实际长度不够返回实际读取的值

*/   

 public int read(byte[] buffer, int offset, int length) { 
        if (closed) {
            return -1;  //结束循环标记.
        }
        int totalBytesRead = 0;

        while (totalBytesRead < length) {
            int numBytesRead = super.read(buffer,
                offset + totalBytesRead,
                length - totalBytesRead);

            if (numBytesRead > 0) {
                totalBytesRead += numBytesRead; //试着再读一下,若numBytesRead==-1 ,重置缓冲区
            }
            else {
                reset();//读到了尽头重置缓冲区

            }
        }
        return totalBytesRead;
    }

 2. 过滤声音,产生回声.

产生的回声需要和原声相叠加.怎么做了?

目前已经能做到,将声音流放入缓冲区: read(byte[] buffer, int offset, int length)

 下面处理buffer:

    public static short getSample(byte[] buffer, int position) {
        return (short)(
            ((buffer[position+1] & 0xff) << 8) |
            (buffer[position] & 0xff));
    }

  将8位的buffer前后相连,转成16位的short类型. wav格式缺省的就是这种16位小端样本

获得了16位的单个数字 .然后就可以对它进行加减运算了. 下面就是处理方法

    public void filter(byte[] samples, int offset, int length) {

        for (int i=offset; i<offset+length; i+=2) {  //每次加二是 因为 short 是byte的长度两倍
            // update the sample
            short oldSample = getSample(samples, i);  
            short newSample = (short)(oldSample + decay *  //原声,加上一个样本产生的衰减-- 回音效果,decay衰减倍数
                delayBuffer[delayBufferPos]);
            setSample(samples, i, newSample); // 混和过的声音要保存起来,它也得产生回声

            // update the delay buffer
            delayBuffer[delayBufferPos] = newSample; // 将这个样本存起来,等待和下一个原声衰减后相加
            delayBufferPos++; 
            if (delayBufferPos == delayBuffer.length) {
                delayBufferPos = 0;
            }
        }
    }

 

 

  评论这张
 
阅读(555)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017