已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章 图形和图像以及动画 1、图形 2、图像 3、动画4、Java的声音功能(可选项)一、图形 1、Java的图形坐标系统 Java的坐标使用像素来作为度量单位。超始坐标0,0是在该applet窗口的左上角处。X坐标的值从0,0点开始向右逐渐增大,y坐标则沿着向下的方向增大。Jdk1.2以前的版本在graphics 里的x,y是不可以出现小数的,所有的像素值都是整数。 2、Point类 该类是形容一个图形坐标系统上的一个点。构造方法如下: Point() 构造一个默认值为(0, 0)的点; Point(int x , int y) 构造一个横纵座标初值为x和y的点; Point(Point p) 以p构造一个点。 成员变量:x:横座标;y:纵座标。 一般方法: void move(int x, int y) 移动到坐标(x, y); Point1.java 3、Graphics类 大多数基本的绘图操作是在类Graphics中定义的方法,它是java.awt包的一部分。这个类的对象表示了一个可以在里边绘制某些内容的环境,它可以是一个小应用程序窗口(如,我们在Applet那一章用到的drawString方法)、图形用户界面的一部分或者是一个打印机。 文本并不是我们能够使用Graphics类来绘制的唯一东西。我们还可画直线、椭圆、圆、弧、矩形和其他多边形。 (1)直线 drawLine()方法是用来在两个点之间画一条直线。该方法接收四个参数:起点的x和y坐标以及终点的x和y坐标,线的宽度被设定成一个像素的大小。 drawLine(x1,y1,x2,y2) (2)矩形 drawRect(x, y, w, h) 绘制一个空心矩形; fillRect(x, y, w, h) 绘制一个实心矩形; 上面两个方法都接收四个参数:矩形的左上角的x和y坐标、矩形的宽度和高度。 drawRoundRect(x, y, w, h, rx, ry) 绘制一个空心的圆角矩形; fillRoundRect(x, y, w, h, rx, ry) 绘制一个实心的圆角矩形。 上面两个方法都接收六个参数:矩形的左上角的x和y坐标、矩形的宽度和高度、圆角的宽度和高度(是一个外接圆)。 (3)多边形 drawPolygon(int x, int y, int numPoints) fillPolygon(int x, int y, int numPoints) 多边形的多个顶点坐标参数数组(x,y)指定,x是所有顶点横坐标的集合,y是所有顶点纵坐标的集合,参数numPoints指定x和y的个数(即,多边形顶点的个数)。 GraphicsDraw.java 练习: 转动的三角。 T1201.java (4)椭圆drawOval(int x, int y, int w, int h)fillOval(int x, int y, int w, int h)椭圆画在一个左上角坐标为(x, y)、宽度和高度为(w, h)的矩形中,如果要是画圆,我们把w,h设为一样,即将其外接矩形指定为正方形即可。 (5)圆弧drawArc(int x, int y, int w, int h, int st, int sw)fillArc(int x, int y, int w, int h, int st, int sw) 圆弧画在一个左上角坐标为(x, y)、宽度和高度为(w, h)的矩形中。圆弧的起点是st,经过sw指定的角度距离,角度按度数指定。角度为零,在水平线上,即时钟3点钟的位置。如果sw值为正值,按逆时针方向绘制圆弧;如果sw值为负值,则按顺时针方向画圆弧。如,画一个3点到6点的逆时针圆弧,如下:fillArc(100,100,200,200,0,270) (6)复制和清除 copyArea(x, y, w, h, mx, my) copyArea()方法接收六个参数:要复制的矩形区域的x,y坐标、该区域的宽度和高度、在显示某个区域的一个备份之前要从该区域移动的水平和垂直间距,它们是以像素为单位。如:将一个100*100像素的区域复制到它右方50个像素、下方25个像素的区域上,如下: copyArea(0,0,100,100,50,25) 方法clearRect()使用了与fillRect()方法相同的四个参数,它用当前窗口的背景色来填充这个矩形区域,效果就好象是擦除了该区域的东西。 (7)限定作图区域 clipRect(int x, int y, int width, int height) 该方法接收四个参数,将作图区域限定在起始点坐标(x, y),width宽和height高的一个矩型中。 GraphicsDraw1.java (8)设置颜色和字体 setBackground(Color.pink) 设置当前窗口的背景色; setForeground(Color.blue) 设置当前窗口的前景色; setColor() 设置“画笔”的颜色; getColor() setFont() 设置“画笔”的字体。 (9)设定画图模式 画图模式决定了对象如何在窗口中画图。默认时,新输出的信息将覆盖窗口上先前存在的内容,然而,使用setXORMode()可以使用新的对象与窗口异或: void setXORMode(Color xorColor) 这里,画对象时,xorColor指定颜色将与窗口异或,XOR模式的优点是无论用什么颜色画对象,新对象总是保证看得见。为了返回覆盖模式,调用下面的方法: void setPaintMode() 通常,对一般的输出都用覆盖模式,特殊目的才用XOR模式。 GraphicsDraw2.java (10)改变坐标值translat(10,10)它改变了一个坐标的值:如果你以前的x 和y的值是0,0如果你调用了translat以后就会把x和y的值改变。(很少使用) 4、Dimension对象 我们可以通过调用窗口对象的getSize()方法,获得得窗口的当前尺寸。该方法返回窗口的尺寸,值则封装在Dimension对象中,是该对象的两个成员变量。 int height 高度; int width 宽度;构造方法:Dimension() 构造一个width,height的值分别是0;Dimension(Dimension f) 通过另一个Dimension的对象把w,h的值传进来;Dimension(int width,int height) 确定width,和height的大小。其他方法:(1)Dimension(ff).equals(Diemsion f) 判断Dimension对象的值是否相等,实际上是指,width,height两个值是否相等;(2)getSize() 它是指获得Dimension对象的width,height的值;(3)getHeight()(4)getWidth()(5)setSize(Dimension f) 它是指把一个已好的对象的值去初始化另一个对象;(6)setSize(double f,double l)(7)setSize(int f,int f)(8)toString() 用一个点去调用他,将返回这个点的信息,你再用StringBuffer 输出来就可以看到这个点的详细情况; 5、FontMetrics类 Java支持多种字体,对大多数字体来说,字符的大小是不一样的-大多数字体的字符有一定的比例,也即不同的字体某个字符的高度、伸长部分(字符的悬挂部分)和水平线之间的空白是变化的。此外,字体点阵的大小是可以修改的。如果我们需要确切的知道某种字体的高度和宽度,就需要使用FontMetrics类。 几个常用术语: Height:字体中最高的字符从上端到下端的高度; Baseline:字符的底端对齐的线; Ascent:从基线到字符顶端的距离; Descent:从基线到字符底部的距离; Leading:一行文本底部到另一行文本顶端之间的距离; 构造方法: FontMetrics(Font fnt) 由于该类是抽象类,不能直接使用new关键字创建,可以调用Component类的方法:FontMetrics fm = getFontMetrics(fnt); fnt是Font类的实例。 常用方法: int StringWidth(String str) 返回str指定的字符串的宽度; int byteWidth(byte b, int start, int numBytes) 返回数组b中存储的numBytes个字符的宽度。字符串的初始位置在start; int charWidth(char c, int start, int numChars) 返回数组c中存储的numChars个字符的宽度。字符串的初始位置在start; int charWidth(char c) 返回c的宽度; int charWidth(int c) int getAscent() 返回字体中最大的头部(上半截); int getDescent() 返回字体中最大的尾部; Font getFont() 返回字体;int getHeight() 返回一行文本的高度值,这个值可被用于控制在窗口中输出多行文本; int getLeading() 返回行间距; int getMaxAdvance() 返回最宽字符的宽度。如果这个值不可得,返回-1; int getMaxAscent() 返回最大头部; int getMaxDescent() 返回最大尾部; int getWidths() 返回最前面256个字符的宽度; String toString() 返回调用对象的字符串形式。练习: 自动居中显示字符串。 Dimension1.java 二、图像 Java提供了对“成像”技术(图形图像的显示和处理)的支持。本节主要讲述AWT的Image类和java.awt.image包。 图像是Image类的对象,该类是java.awt包的一部分。图像是一个“矩形”的图形对象。通过使用java.awt.image包中的类,可以实现对图像的操作。java.awt.image定义了大量的成像类和接口,把它们全部介绍一遍几乎是不可能的。作为一种替换的做法,我们将介绍形成成像基础的一些类和接口。 1、文件格式 最初,网上的图像只能是GIF格式的。GIF图像格式由CompuServe公司在1987年创建的,它使在线查看图像成为可能,所以这种格式非常适合于Internet。但是,每幅GIF图像最多只能有256种颜色,这个限制使一些订的浏览器开发商在1995年增加了对JPEG图像格式的支持。JPEG格式是由一组图像专家创建的,用于存储具有全频谱、边疆色调的图像。如果创建方法得当,当取用同一源图像时,这些JPEG图像将比GIF编码的图像具有更高的保真度和更大的压缩比。在几乎任何情况下,我们都不要关心或注意程序使用的是哪一种格式的图像。Java图像类抽象出了其接口后的不同。 2、图像的创建、装载和显示 处理图像时,通常会发生三种类型的操作:创建图像、装载图像、显示图像。在Java中,Image类一般用于特指内存中的图像以及必须从外部图片资源装载的图像。 (1)创建图像对象 java.awt包中的Component类有一个称为createImage()的方法,可用于创建Image对象,因为所有AWT组件都是Component的子类,所以它们都支持这个方法。 Image createImage(ImageProducer imgProd) Image createImage(int width, int height) 第一种方式将返回一个由imgProd生成的图像,而imgProd是实现ImageProducer接口的类的对象;第二种形式将返回一个具有指定宽度和高度的空图像(也就是空白图像)。 如果将一个图像与应用程序中的Image对象联系起来,我们可以调用Toolkit类的createImage()方法。Toolkit用来在Java中提供和维护图形化的用户界面,我们无法创建Toolkit对象,但我们可以通过调用类方法来得到一个。如: Toolkit kit = Toolkit.getDefaultToolkit(); 类Toolkit可以使用如下方法加载图像: getImage(String) 从图形文件中创建一个带有指定名字的Image对象,该名字可以是一个文件名(例如fillmore.jpg)或者到某个文件夹和文件名的引用(例如c:whigsfillmore.jpg)。 getImage(URL) 从由URL对象指定的因特网地址上的图形文件中创建一个Image对象。 (2)装载图像 另外一种得到图像的途径就是进行装载。要这样做,需要使用由Applet类定义的getImage()方法。它有下面的形式: Image getImage(URL url) Image getImage(URL url, String imageName) 第一种形式返回一个Image对象,它将把出现在由url指定定位置的图像装入。第二种形式也将返回一个Image对象,它装入的图像出现在由url批定的位置,其名字由imageName来确定。 通过一个小应用程序中调用getCodeBase(),我们可以得到一个URL对象,它代表着存放该小应用程序的类文件的文件夹。另一个小应用程序方法,getDocumentBase(),返回了一个与加载该小应用程序相关的URL。如: Image getImage(getCodeBase(), img.jpg); (3)显示图像 一旦拥有了一幅图像,可以通过使用Graphics类的一个成员drawImage()来显示它。它有下面几种形式。boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) boolean drawImage(Image img, int x, int y, ImageObserver observer) 显示由img传递的图像,图像的左上角位置由x,y确定。Observer是实现ImageObserver接口的类的引用,这个接口可以由所有的AWT组件实现。图像观测器(image observer)是一个在图像被装载时监视它的对象。boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 显示由img传递的图像,图像的左上角位置由x,y确定,图像的外接矩型的宽和高由width和height确定,效果是图像被自由缩放在一个固定的区域内。boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) 显示由img传递的图像,图像的左上角位置由dx1,dy1确定,图像的右下角位置由dx2,dy2确定,sx1,sy1确定显示图像内容的左上角坐标,sx2,sy2确定显示图像内容的右下角坐标,效果就是只显示图像的一部分,并且在固定的区域内伸缩。 DrawImage.java 方法drawImage()的最后一个参数常常是关键字this,表示在一个对象内来引用对象本身。这个关键字this是用来标明该小应用程序在从万维网上被下载下来时能够记录某个图像。图像的加载是通过接口ImageObserver来跟踪记录的。实现了这个接口的类,如Applet,可以记录一个图像的加载过程。这可以用来创建某些程序,在加载图像文件时,这些程序会显示出一条诸如“Loading images”之类的消息。 对ImageObserver现有的支持相对于小应用程序中的图像来说,已经是完全够用了,因此关键字this经常被用作drawImage()方法中。 当在Applet的init()方法中装载img时,我们可以在屏幕上看到它,这是因为每次更多的图像数据到达时,Applet的ImageObserver接口的实现会调用paint()方法。 3、ImageObserver ImageObserver是一个接口,用于在图像生成时接收通知。ImageObserver只定义了一种方法:imageUpdate()。使用图像观测器可以执行其他的操作,例如显示进程指示器或趣味屏幕。 boolean imageUpdate(Image img, int fags, int left, int top, int width, int height) img是被装载的图像,flags是与更新报告状态联系的一个整型数。Left、top、width和height四个整型数代表了一个矩形,其中包含了依赖于flags中所传递数值的不同数值。如果完成装载,imageUpdate()将返回false;如果有更多的图像需要处理,将返回true。 flags参数包含1位或多位标记,这些标记被定义为ImageObserver接口中的静态变量。这些标记和它们所提供的信息如下所示: WIDTH width参数是有效的并且包含图像的宽度值; HEIGHT height参数是有效的并且包含图像的高度值; PROPERTIES 现在可以使用img.getProperty()得到与图像相关联的属性; SOMEBITS 描绘图像所需的更多像素已被接收到。参数left,top,width和height定义了包含新像素的矩形; FRAMEBITS 作为以前绘制的多帧图像一部分的一个完整帧已被接收到。这个帧可以被显示。不使用参数left,top,width和height; ALLBITS 图像完成。不使用参数left,top,width和height; ERROR 被异步追踪的一个图像发生了错误。图像没有被完成,不能显示。不会有更多的图像信息被接收。ABORT标记将被设置,以指示图像制作过程失败; ABORT 被异步追踪的一个图像在完成前被放弃。不过,如果没有错误发生,对任何图像数据的访问都将重新启动图像的制作过程。在实际中,我们需要覆盖imageUpdate()方法。因为在Applet中,imageUpdate()的默认实现方式存在几个问题。 (1)在新数据到达时,它会重新绘制整个图像。这会引起背景颜色和图像的不断闪烁。 (2)它使用Applet.repaint()的功能使系统每隔1/10秒左右的时间来重新绘制图像。如果图像处于正在绘制的过程中,这会给人一种不稳定、不舒服的感觉。 (3)默认的实现过程对可能装载失败的图像一无所知。很多刚开始进行Java编程的程序员都遇到过一种事情,就是getImage()总是会成功,而被指定的图像可能根本就不存在。除非出现imageUpdate(),否则就不可能发现丢失的图像。如果采用imageUpdate()的默认实现过程,那么就永远也无法知道到底发生了什么事。在调用g.drawImage()的时候,paint()方法不会做任何事。 DrawImage1.java 4、双缓冲技术 Netmeeting观看 MoveText.java ,使图像产生抖动的根本原因在于Applet中的update()方法,当在Applet中repaint()调update()方法,update()调paint()方法。 public void update(Graphics g) g.setColor(getBackground(); g.fillRect(0,0,width,height); g.setColor(getForeground(); paint(g); 整个update()方法的工作过程是首先以当前窗口的背景色填充整个窗口,然后再调用paint()方法重新绘制,所以产生抖动。 解决抖动的方法是使用以缓冲技术(double-buffer),即把欲输出的内容首先输出在后台,再输出整个后台。即使用图像脱屏的方法来减轻屏幕抖动。实现双缓冲的步骤如下: (1)创建后台 Image offScreenImage = createImage(getSize().width,getSize().height); Graphics offScreenGraphics=offScreenImage.getGraphics(); (2)把原来paint方法中执行的绘图动作移到后台完成 offScreenGraphics.draw (3)在paint方法中最后输出后台 g.drawImage(offScreenImage, 0 ,0 , this); (4)覆盖update()方法 public void update(Graphics g) paint(g); 练习: 建一个applet,两个线程,一个在下面显示跑马灯字幕,一个在上面显示闪烁信息。 Jxt12c.java 5、MediaTracker类 许多早期的Java开发者都发现,在有多个图像需要装载时,ImageObserver接口理解和管理起来非常困难。于是找到一种更简单的解决方法,以允许程序员同时装载全部图像,而不必考虑imageUpdate()。为了响应这个要求,Sun公司在JDK的后续版本中添加了这个类,是用来进行图像的跟踪的,用于检查若干并行图像随机状态的对象。要使用MediaTracker,需创建一个新的实例并使用它的addImage()方法来跟踪图像的装载状态。MediaTracker tracker=new MediaTracker(this); 构造方法需要一个Component类实例 void addImage(Image img, int imgID)void addImage(Image img, int imgID, int width, int height)成员变量: ABORTED:失败 COMPLETE:完成 ERRORED:错误 LOADING:装载 这里,img是被跟踪的图像。它的识别号码由imgID传递。ID编号不要求是唯一的。可以给几个图像使用同一个编号,这时的意义是将它们识别为同一个组。在第二种形式中,width和height确定了对象被显示时的尺寸。 一旦注册了图像,可以检查它是否被装载,或者等待它被完全装载。常用方法如下: boolean checked(int imgID) 检测图片是否加载完毕; boolean checkAll() 检测所有图片是否加载完毕; Object getErrorsAny() 返回跟踪加载过程中的错误列表; Object getErrorsID() 返回错误跟踪列表; void removeImage(Image img) 移除图片; void removeImage(Image img, int imgID) 移除图片; int statusAll(boolean load) int statusID(int id, boolean load) 检测图像状态; void waitForAll() 等待全部图像加载完成; void waitForID(int) 等待某个图像加载工作的完成。使用MediaTracker分为下面的三步:(1)创建MediaTracker实例。(2)使用MediaTracker.addImage()指明要跟踪的图像对象。(3)创建try/catch块。try块等待和ID相关的图像完全加载。由于MediaTracker的waitForID方法可能抛出InterruptedException方法,而且不必通过将变量flags和正确的常量求与来判断什么时候图像被完全加载。不管怎样,如果使用MediaTracker,就必须执行上面所说的三个步骤。上面所说的三个步骤最好被一次实现并一个辅助方法中完成,如下面所给出的那样:public static void waitForImage(Component component,Image image) MdeiaTracker tracker = new MediaTracker(component);trytracker.addImage(image,0);tracker.waitForID(0);catch(InterruptedException e)e.printStackTrace();在该程序代码中,将等待图像简化为一个简单的语句不必覆盖方法、不用求位与或执行try/chtch块。 DrawImage1.java 练习:幸运52。 luck.java 6、ImageProducer接口 该接口用于给图像产生数据的对象。实现ImageProducer接口的对象将提供整型或字节数组,它们代表着图像数据并产生Image对象。如前面介绍过的,有一种createImage()方法可将ImageProducer对象用做它的参数。在java.awt.image中包含两个图像生成器: MemoryImageSource和FilteredImageSource。 MemoryImageSource类 该类是一个从数据数组中创建新Image的类。它定义了几种构造方法,下面介绍其中一种: MemoryImageSource(int width, int height, int pixel, int offset, int scanLineWidth) MemoryImageSource对象产生于由pixel确定的整型数组,以默认的RGB颜色模式中,一个像素就是一个带有Alpha、Red、Green和Blue(0xAARRGGBB)的整型数。Alpha值代表了像素的透明度。完全透明是0,完全不透明是255.生成图像的宽度和高度值由width和height传递。像素数组中开始读取数据的起点由offset传递。扫描行的宽度(经常与图像的宽度值相同)由scanLineWidth传递。三、动画 在动画编程中,要考虑的一件事是如何使用系统资源。将许多图形移来移去可能会耗费大量的处理器时间,尤其是如果我们在执行某些复杂的任务,例如转换图形或检测两个运动对象间冲突等情况。 如果在我们的用户界面中包括了一个复杂的动画组件时,我们会发现该界面的元素响应起来比较缓慢-下拉列表要用1秒或更多的时间来显示,按扭的单击也明显变慢等等。 动画与在Java程序中的其他耗费处理器的内容一样,可以使用Java语言中的线程特性来独立于程序其他部分而单独运行。在制作单元格动画时,首先要收集图像,然后组织并加载这些图像,并一次一个地显示出来,这样就产生了运动的外观。从图形文件创建动画的一个办法是将每个图像存储在一个Image对象的数组中,使用一个整数来记录哪个数组元素要被显示出来。 star.java 霓虹招牌 四、Java的声音功能 1、获取并使用声音 Java通过类Applet支持声音文件的回放,我们可以将某个声音只播放一次,或者作为循环来重复播放。 在Java 2之前,该语言只能处理一种音频格式:8KHz的单声AU,它具有mu规则的编码。如果你想使用类似WAV之类的声音文件,必须将它转换成mu规则的AU,这通常会造音质上的一些损失。 Java 2中对声音加入了许多过滤工作。我们可以加载并播放具有下列格式的数字化声音文件:AIFF、AU和WAV。它还支持三种基于MIDI的歌曲文件格式:第一种MIDI类型,第二种MIDI类型和RMF。大大改进了声音支持能够处理单声道或立体声中的8位或16位音频数据,其采样率的范围可以从8KHz到48KHz。 获取并播放声音的最简单的方式是通过类Applet中的play()方法。它有下面两种格式: void play(URL url) 能够加载并播放存储在URL上的音频; void play(URL url, String name) 一个基本的URL和一个文件夹路径名-它能够加载并播放那个音频文件。第一个参数通常是一个getDocumentBase()或getCodeBase()调用。 如:play(getCodeBase(), “zap.au”); 方法play()在被调用之后,会尽可能快地去获取并播放给定的声音。如果找不到这个声音文件,你所能接受到的有关问题信息的指示就是没声音。它不会显示任何出错信息。 要重复播放某个声音,开始和停止该声音,或者将它作为一个循环重复地播放,必须通过使用该小应用程序的getAudioClip()方法将它放入到一个AudioClip对象中。该类是java.applet包中的一部分。 方法getAudioClip()使用了与play()方法相同风格的一个或两个参数。第一个参数是一个URL参数,它表明了该声音文件,而第二个参数是一个对文件夹路径的引用。 如:AudioClip clip = getAudioClip(getCodeBase(), “audio/marimba.wav”); 在上面的例子中,文件名包含了一个文件夹引用,因此文件marimba.wav会从子文件夹audio中被加载。 方法getAudioClip()只能在一个小应用程序中被调用。在Java 2里,应该程序可以通过使用newAudioClip()来加载声音文件,这是java.awt.Applet类的一个类方法。 如:AudioClip clip = Applet.newAudioClip(“audio/marimba.wav”); 当创建一个AudioClip对象后,可以调用它play()、stop()和loop()等方法。 如果方法getAudioClip()或者newAudioClip()不能找到由它们的参数所所定的声音文件,AudioClip对象的值将会是null。试图播放一个null对象会导致出错,因此在使用一个AudioClip对象之前要检测这个条件。 多个声音可以同时播放-它们可以在回放时被混在一起。 当在一个小应用程序中使用了一个声音循环时,注意当该小应用程序的运行线程停止时,该循环并不会自动终止。如果网页用户移动到其他的页面时,这个声音继续播放。我们可以修正这个问题,通过在该小应用程序结程被终止的同时在循环声音上使用方法stop()。2、JavaSound 新版本的Java包含了几个包,这些包大大扩了Java语言创建和播放声音的功能。 javax.sound.midi 用来播放、录制和合成MIDI格式声音的类; javax.sound.sampled 用来播放、录制和混合录制的声音文件。 JavaSound库支持所有能在小应用程序和应用程序回放的音频格式:AIFF、AU、MIDI和WAV。它也支持RMF,这是一个针对RICH media Format音乐文件的标准。 (1)MIDI文件 MIDI音乐文件是一种将声音存储为一系列的音符和效果,这些音符和效果可以由计算机合成乐器来产生。 与代表实际声音记录的采样文件和用于计算机表示的数字化声音(例如AWV和AU)不同,MIDI比起实际的录音来更加接近于合成器的音乐乐谱。MIDI文件是一些存储指讼,它告诉MIDI音序器如何重新产生这些声音、使用哪些合成乐器以及其他的方面的介绍。MIDI文件的声音依赖于在计算机系统或输出设备上能够得到的乐器的质量和种类。 MIDI文件通常比录制的声音要小得多,而且它们不适合表示语音和其他一些类型的声音。但是,因为它的压缩性和功效性,MIDI被应用在许多方面,例如计算机游戏的背景音乐、流行音乐的Muzak风格版本或者为作曲家和学生提供的经典作曲的初步介绍。 MIDI文件是通过一个音序器来播放的,这可以是一个硬件设备或者是一个软件程序,它将播放一个叫做音序的数据结构。音序是由一个或多个记录组成的,每一个都包含 了一系列标注有时间的MIDI音符和叫做MIDI事件的效果指令。 这些MIDI陈述中的每一个效果都是通过在java.sound.midi包中的某个接口或类来表示的:接口Sequencer和类Sequence、Track和MidiEvent。 还有一个MidiSystem类,它提供了对计算机上的MIDI回放和存储资源的访问。 (2)播放一个MIDI文件 要播放一个使用JavaSound的MIDI文件,必须创建一个基于某个特定系统的MIDI处理能力的Sequencer对象。 MidiSystem类的类方法getSequencer()返回了一个Sequen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 23春国家开放大学电大《人力资源管理》形考任务1及4网考题库答案
- 2025年锦州辅警协警招聘考试真题附答案详解(a卷)
- 2025年鄂州辅警招聘考试真题含答案详解
- 2025年青海辅警协警招聘考试真题附答案详解(基础题)
- 2025年阿克苏辅警协警招聘考试备考题库含答案详解(精练)
- 2025年淮南辅警协警招聘考试备考题库附答案详解(黄金题型)
- 2025年阜阳辅警协警招聘考试真题及答案详解(典优)
- 2025年省属虚拟辅警协警招聘考试真题附答案详解(满分必刷)
- 2025“安全生产月”《安全知识》竞赛答题活动试题库
- 2025年通辽辅警协警招聘考试真题附答案详解
- 南京市社区工作者招聘笔试真题2024
- 手术病理标本管理课件
- 2025至2030个人生活小家电行业市场发展前景及供给需求与投资机会报告
- 国企员工违法违纪案件警示教育心得体会
- 2025中国单机游戏市场现状报告
- 诉讼案件备案管理制度
- 江河幕墙公司管理制度
- 《汉字演变与书法艺术欣赏课教案》
- 2024年法律职业资格(客观题)真题带解析
- 2025-2030中国医疗应急系统行业市场发展趋势与前景展望战略研究报告
- 物流工厂合同协议
评论
0/150
提交评论