java:用 javax.sound.midi 播放 midi 文件

17 篇文章 0 订阅

编写 play_mid.groovy  如下

import java.io.File;
import java.net.URL;
import java.util.*;
import java.applet.Applet;
import java.applet.AudioClip;

class PlayMid {

    public static void main(String[] args) throws Exception {
        if (args.length ==0){
            println(" usage: groovy play_mid file1.mid ");
            return;
        }
        File file = new File(args[0]);
		if (!file.exists()) {
			System.err.println(" file is not exists ");
			return; 
		}
        URL url = file.toURL();
        println(url);
        
        AudioClip audio = Applet.newAudioClip(url);
        audio.play();
        // 延时,用于播放音乐
        //Thread.sleep(10000);
        System.in.read();
        audio.stop();
    }
}

运行  groovy play_mid  test1.mid


编写  PlayMidi.java  如下

import java.io.File;
import java.net.URI;
import java.util.*;
import java.applet.Applet;
import java.applet.AudioClip;

class PlayMidi {

    public static void main(String[] args) throws Exception {
        if (args.length ==0){
            System.out.println(" usage: java PlayMidi file1.mid ");
            return;
        }
		String f1 = args[0];
		if (!f1.endsWith(".mid") && !f1.endsWith(".MID")){
			System.out.println("Error: "+f1+" is not .mid file ");
			return;
		}
		File file1 = new File(f1);
		if (!file1.exists()){
			System.out.println("Error: "+f1+" is not exists.");
			return;
		}
        URI uri = file1.toURI();
        System.out.println(uri);
        long time1 = System.currentTimeMillis(); // start time
        AudioClip audio = Applet.newAudioClip(uri.toURL());
        audio.play();
        // 延时,用于播放音乐
        //Thread.sleep(10000);
        System.in.read();
        audio.stop();
        long time2 = System.currentTimeMillis(); // end time
        System.out.println("run time: " +(time2-time1) +" ms");
    }
}

编译  javac -encoding utf-8  PlayMidi.java

SET CLASSPATH=.

运行 java PlayMidi happy_birthday.mid

或者 java -cp . PlayMidi happy_birthday.mid

happy_birthday.mid 参见:python:music21 解析 mid文件;生成 mid文件


编写  MidiPlay.java  如下

import java.io.*;
import java.util.*;
import javax.sound.midi.*;

public class MidiPlay {
    // Midi文件播放
    public static void main(String[] args) {
        if (args.length ==0){
            System.out.println(" usage: java MidiPlay file1.mid ");
            return;
        }
		String f1 = args[0];
		if (!f1.endsWith(".mid") && !f1.endsWith(".MID")){
			System.out.println("Error: "+f1+" is not .mid file ");
			return;
		}
		File file1 = new File(f1);
		if (!file1.exists()){
			System.out.println("Error: "+f1+" is not exists.");
			return;
        }
        try {
            // 假设我们有一个MIDI文件路径
            //String midiFilePath = "path/to/your/midi/file.mid";
            
            // 创建一个MIDI设备并打开它
            Sequencer sequencer = MidiSystem.getSequencer();
            sequencer.open();
            
            // 构建一个MIDI输入流来读取MIDI文件
            InputStream fis = new FileInputStream(f1);
            Sequence sequence = MidiSystem.getSequence(fis);
            
            // 设置MIDI序列到播放器
            sequencer.setSequence(sequence);
            
            // 开始播放MIDI
            sequencer.start();
            
            // 等待MIDI播放完成或用户中断
            while (sequencer.isRunning()) {
                Thread.sleep(1000);
            }
            
            // 关闭MIDI设备和输入流
            sequencer.stop();
            sequencer.close();
            fis.close();
            
        } catch (InvalidMidiDataException ex) {
            ex.printStackTrace();
            System.out.println("MIDI数据无效,请检查MIDI文件格式是否正确。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编译  javac -encoding utf-8  MidiPlay.java

运行  java MidiPlay happy_birthday.mid

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现对MIDI文件格式的支持和操作,可以使用Java MIDI API中的相关类和方法。在Java MIDI API中,MIDI文件以标准的MIDI文件格式(SMF)存储。SMF文件由一个或多个MIDI轨道组成,每个轨道包含一系列MIDI事件。 下面是一些操作MIDI文件的示例代码: ### 读取MIDI文件 ```kotlin import javax.sound.midi.* fun readMidiFile(filename: String): Sequence = MidiSystem.getSequence(FileInputStream(File(filename))) ``` 使用`MidiSystem.getSequence()`方法读取MIDI文件,该方法将返回一个`Sequence`对象,代表MIDI序列。 ### 写入MIDI文件 ```kotlin import javax.sound.midi.* fun writeMidiFile(sequence: Sequence, filename: String) { val file = File(filename) MidiSystem.write(sequence, 1, file) } ``` 使用`MidiSystem.write()`方法将`Sequence`对象写入MIDI文件中。 ### 操作MIDI轨道 ```kotlin import javax.sound.midi.* fun manipulateTrack(sequence: Sequence, trackNumber: Int) { val track = sequence.tracks[trackNumber] // 在轨道中添加一个MIDI事件 val noteOn = ShortMessage(ShortMessage.NOTE_ON, 0, 60, 93) val noteOff = ShortMessage(ShortMessage.NOTE_OFF, 0, 60, 0) val noteOnEvent = MidiEvent(noteOn, 0) val noteOffEvent = MidiEvent(noteOff, 100) track.add(noteOnEvent) track.add(noteOffEvent) // 修改轨道中的MIDI事件 val event = track.get(0) if (event.message is ShortMessage) { val message = event.message as ShortMessage message.data1 = 62 } // 删除轨道中的MIDI事件 track.remove(noteOffEvent) } ``` 使用`Sequence.tracks`属性获取`Sequence`对象中的所有轨道,然后可以使用`Track`对象的方法来添加、修改和删除MIDI事件。 这些代码只是Java MIDI API的一小部分,更多的类和方法可以在Java官方文档中找到。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值