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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值