分享
 
 
 

应用Nokia UI API处理声音问题

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

作者:mingjava 文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=147

Nokia UI API的目的在于提供一些MIDP1.0中没有提供的功能,本文讲述如何使用Nokia UI中提供的声音处理的API。在com.nokia.mid.sound包中有一个Sound类和SoundListener接口,SoundListener接口的作用就是当播放的状态转换的时候,监听器中的方法被调用,也就是我们常说的回调。这里不做介绍了。

Sound类封装了用于播放声音的方法,手机所能支持的声音格式和并行播放的数量是和设备相关的,我们可以通过方法supportedFormat = Sound.getSupportedFormats();

Sound.getConcurrentSoundCount()方法得到这些数据。下面提供一个小程序用户判断我的手机nokia 6108所能支持的声音类型和并行播放的数量。

package com.j2medev.test;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Form;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import com.nokia.mid.sound.*;

public class NokiaSound extends MIDlet

{

private Display display;

private Form mainForm;

private int[] supportedFormat;

protected void startApp() throws MIDletStateChangeException

{

initMIDlet();

}

public void initMIDlet()

{

display = Display.getDisplay(this);

mainForm = new Form("Nokia Sound");

supportedFormat = Sound.getSupportedFormats();

if (supportedFormat.length == 0)

{

mainForm.append("No audio format supported!");

} else

{

for (int i = 0; i < supportedFormat.length; i++)

{

mainForm.append("" + supportedFormat[i] + " : "

+ Sound.getConcurrentSoundCount(supportedFormat[i]));

}

}

display.setCurrent(mainForm);

}

protected void pauseApp()

{

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException

{

}

}

程序运行在nokia 6108上显示1:1表示本机支持单音,并行播放数量也是1。

Sound类有两个构造器

Sound(byte[] data, int type)

Sound(int freq, long duration)

我们主要讲述后者,通过提供给构造器或者init(int freq,long duration)方法适当的频率和持续时间来初始化声音对象,通过调用play()方法可以播放声音,调用stop方法可以停止声音的播放。关于Sound类提供的其他API请参考Nokia Ui java doc。这里给出频率参数

Freq off 0

Ring freq A0 220

Ring freq B0b 233

Ring freq B0 247

Ring freq C0 262

Ring freq D0b 277

Ring freq D0 294

Ring freq E0b 311

Ring freq E0 330

Ring freq F0 349

Ring freq G0b 370

Ring freq G0 392

Ring freq A1b 416

Ring freq A1 440

Ring freq B1b 466

Ring freq B1 494

Ring freq C1 523

Ring freq D1b 554

Ring freq D1 587

Ring freq E1b 622

Ring freq E1 659

Ring freq F1 698

Ring freq G1b 740

Ring freq G1 784

Ring freq A2b 831

Ring freq A2 880

Ring freq B2b 932

Ring freq B2 988

Ring freq C2 1047

Ring freq D2b 1109

Ring freq D2 1175

Ring freq E2b 1245

Ring freq E2 1319

Ring freq F2 1397

Ring freq G2b 1480

Ring freq G2 1568

Ring freq A3b 1661

Ring freq A3 1760

Ring freq B3b 1865

Ring freq B3 1976

Ring freq C3 2093

Ring freq D3b 2217

Ring freq D3 2349

Ring freq E3b 2489

Ring freq E3 2637

Ring freq F3 2794

Ring freq G3b 2960

Ring freq G3 3136

Ring freq A4b 3322

Ring freq A4 3520

Ring freq B4b 3729

Ring freq B4 3951

Ring freq C4 4186

Ring freq D4b 4434

Ring freq D4 4698

Ring freq E4b 4978

Ring freq E4 5274

Ring freq F4 5588

Ring freq G4b 5920

Ring freq G4 6272

Ring freq A5b 6644

Ring freq A5 7040

Ring freq B5b 7458

Ring freq B5 7902

Ring freq C5 8372

Ring freq D5b 8870

Ring freq D5 9396

Ring freq E5b 9956

Ring freq E5 10548

Ring freq F5 11176

Ring freq G5b 11840

Ring freq G5 12544

Ring freq A6b 13288

下面我们编写一个小程序来讲述如何使用Nokia UI来处理声音问题,我们的目的是当用户按下按键的时候开始播放声音,当用户释放按键的时候停止播放,我们提供一个ToneCanvas类来显示用户按下的键,并通过TonePlayer类来播放适当频率的声音。

package com.j2medev.tone;

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Graphics;

import com.nokia.mid.ui.FullCanvas;

public class TonesCanvas extends FullCanvas

{

private TonesMIDlet midlet;

private int pressNum;

private int currentKey;

private TonePlayer player = new TonePlayer();

private static int freq[][] = { { 523, 554 }, { 587, 622 }, { 659, 659 },

{ 698, 740 }, { 784, 831 }, { 880, 932 }, { 988, 988 },

{ 1047, 1109 }, { 1175, 1245 }, { 1319, 1319 }, { 1397, 1480 } };

public static final int NAT = 0;

public static final int SHARP = 1;

private int x = this.getWidth() / 2;

private int y = this.getHeight() / 2;

private boolean sharp = false;

public TonesCanvas(TonesMIDlet midlet)

{

super();

this.midlet = midlet;

// TODO Auto-generated constructor stub

}

public void paint(Graphics g)

{

if (pressNum == -1)

{

return;

}

String note = (sharp == true) ? "#" : "";

g.setColor(128, 255, 18);

g.fillRect(0, 0, getWidth(), getHeight());

g.setColor(124, 124, 0);

g.drawString(pressNum + note, x, y, Graphics.LEFT | Graphics.TOP);

}

public void keyPressed(int keyCode)

{

if (keyCode == Canvas.KEY_POUND)

{

sharp = !sharp;

} else

{

switch (keyCode)

{

case Canvas.KEY_NUM0:

pressNum = 0;

break;

case Canvas.KEY_NUM1:

pressNum = 1;

break;

case Canvas.KEY_NUM2:

pressNum = 2;

break;

case Canvas.KEY_NUM3:

pressNum = 3;

break;

case Canvas.KEY_NUM4:

pressNum = 4;

break;

case Canvas.KEY_NUM5:

pressNum = 5;

break;

case Canvas.KEY_NUM6:

pressNum = 6;

break;

case Canvas.KEY_NUM7:

pressNum = 7;

break;

case Canvas.KEY_NUM8:

pressNum = 8;

break;

case Canvas.KEY_NUM9:

pressNum = 9;

break;

case Canvas.KEY_STAR:

pressNum = 10;

break;

default:

pressNum = -1;

break;

}

if (pressNum != -1)

{

player.play(freq[pressNum][sharp == false ? NAT : SHARP]);

}

}

currentKey = keyCode;

repaint();

}

public void keyReleased(int keyCode)

{

if (keyCode == currentKey)

{

pressNum = -1;

player.stop();

}

repaint();

}

}

package com.j2medev.tone;

import com.nokia.mid.sound.Sound;

public class TonePlayer

{

private Sound sound;

public TonePlayer()

{

super();

sound = new Sound(0, 2000);

}

public void play(int freq)

{

sound.init(freq, 2000);

sound.play(1);

}

public void stop()

{

sound.stop();

}

}

package com.j2medev.tone;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class TonesMIDlet extends MIDlet

{

private final TonesCanvas canvas;

public TonesMIDlet()

{

canvas = new TonesCanvas(this);

}

public void startApp()

{

Display.getDisplay(this).setCurrent(canvas);

}

public void pauseApp()

{

}

public void destroyApp(boolean unconditional)

{

}

void exitRequested()

{

destroyApp(false);

notifyDestroyed();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有