Java编程:MIDI消息与GUI事件处理
立即解锁
发布时间: 2025-08-18 01:24:42 订阅数: 7 

### Java编程:MIDI消息与GUI事件处理
#### 1. MIDI消息基础
MIDI消息是事件的核心部分,它包含了要执行的实际指令。指令的第一个参数始终是消息类型,而其他三个参数的值则取决于消息类型。例如,类型为144的消息表示“NOTE ON”,即开始播放音符。要执行“NOTE ON”操作,音序器需要知道几个关键信息:
- **通道(Channel)**:可以将通道想象成乐队中的音乐家。通道1可能是键盘手,通道9通常是鼓手等。
- **音符(Note to play)**:用0到127之间的数字表示,数字越小,音符越低;数字越大,音符越高。
- **速度(Velocity)**:表示按键的力度,0表示非常轻柔,可能几乎听不到声音,100是一个不错的默认值。
创建MIDI消息时,需要创建一个`ShortMessage`实例,并调用`setMessage()`方法,传入四个参数。例如:
```java
a.setMessage(144, 1, 44, 100);
```
这里,144是消息类型(“NOTE ON”),1是通道,44是要播放的音符,100是速度。
而类型为128的消息表示“NOTE OFF”,即停止播放音符。示例代码如下:
```java
b.setMessage(128, 1, 44, 100);
MidiEvent noteOff = new MidiEvent(b, 3 );
```
#### 2. 对MIDI消息进行实验
了解了MIDI消息的组成后,就可以进行一些实验,包括改变播放的音符、音符的持续时间以及乐器等。具体操作步骤如下:
- **改变音符**:在“NOTE ON”和“NOTE OFF”消息中,尝试使用0到127之间的数字。示例代码:
```java
a.setMessage(144, 1, 20, 100);
```
- **改变音符的持续时间**:修改“NOTE OFF”事件(而不是消息),使其在更早或更晚的节拍发生。
- **改变乐器**:在播放音符的消息之前添加一个新消息,将通道1的乐器设置为默认钢琴以外的其他乐器。改变乐器的消息类型是192,第三个参数表示实际的乐器(可以尝试0到127之间的数字)。示例代码:
```java
first.setMessage(192, 1, 102, 0);
```
#### 3. 使用命令行参数进行声音实验
下面的代码展示了如何使用命令行参数来改变乐器和音符:
```java
import javax.sound.midi.*;
public class MiniMusicCmdLine {
public static void main(String[] args) {
MiniMusicCmdLine mini = new MiniMusicCmdLine();
if (args.length < 2) {
System.out.println("Don’t forget the instrument and note args");
} else {
int instrument = Integer.parseInt(args[0]);
int note = Integer.parseInt(args[1]);
mini.play(instrument, note);
}
}
public void play(int instrument, int note) {
try {
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
MidiEvent event = null;
ShortMessage first = new ShortMessage();
first.setMessage(192, 1, instrument, 0);
MidiEvent changeInstrument = new MidiEvent(first, 1);
track.add(changeInstrument);
ShortMessage a = new ShortMessage();
a.setMessage(144, 1, note, 100);
MidiEvent noteOn = new MidiEvent(a, 1);
track.add(noteOn);
ShortMessage b = new ShortMessage();
b.setMessage(128, 1, note, 100);
MidiEvent noteOff = new MidiEvent(b, 16);
track.add(noteOff);
player.setSequence(seq);
player.start();
} catch (Exception ex) {ex.printStackTrace();}
}
}
```
运行该程序时,需要传入两个0到127之间的整数参数,第一个参数设置乐器,第二个参数设置要播放的音符。例如:
```
%java MiniMusicCmdLine 102 30
%java MiniMusicCmdLine 80 20
%java MiniMusicCmdLine 40 70
```
#### 4. 异常处理相关练习
在Java编程中,异常处理是一个重要的部分。以下是一些与异常处理相关的判断题及答案:
| 序号 | 陈述 | 答案 |
| ---- | ---- | ---- |
| 1 | 一个`try`块必须后面跟着一个`catch`和一个`finally`块。 | 错误,`try`块后面可以跟着`catch`块、`finally`块,或者两者都有。 |
| 2 | 如果你编写
0
0
复制全文
相关推荐









