# lumusic **Repository Path**: mike_qubit/lumusic ## Basic Information - **Project Name**: lumusic - **Description**: 音乐描述格式(musicxml)、电子五线谱绘制及其自动播放系统 、MIDI乐器接口 等音乐编程性基础套件。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2025-01-24 - **Last Updated**: 2025-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 可编程式音乐描述集合(computer programming of music description toolkit,mdt) ``` 目录 1、musicxml数字乐谱描述 2、musiccode乐谱可编程性 3、player乐谱播放器 4、musicscore乐谱绘图 5、GUI用户界面 6、MIDI和其它 ``` 图片替换文本 ### 一、musicxml数字乐谱描述套件 在musicxml中,ScorePartwise是数字乐谱的顶层数据结构,其语法必须符合W3C规范: ``` package musicxml.example; import musicxml.ScorePartwise; import musicxml.part.Part; import musicxml.part.measure.Measure; import musicxml.part.measure.attributes.Attributes; import musicxml.part.measure.attributes.Division; import musicxml.part.measure.attributes.clef.Clef; import musicxml.part.measure.attributes.key.Key; import musicxml.part.measure.attributes.time.Time; import musicxml.part.measure.note.Duration; import musicxml.part.measure.note.Note; import musicxml.part.measure.note.Staff; import musicxml.part.measure.note.Type; import musicxml.part.measure.note.pitch.Alter; import musicxml.part.measure.note.pitch.Octave; import musicxml.part.measure.note.pitch.Pitch; import musicxml.part.measure.note.pitch.Step; public class Music_1 { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { //创建乐谱 ScorePartwise scorePartwise = new ScorePartwise("music1"); //设置分谱和乐器名字 scorePartwise.addScorePart("p1", "piano"); //分谱 Part part = scorePartwise.getPart("p1"); //小节 Measure measure = new Measure(1); Attributes attributes = new Attributes(); //division要最先设置 attributes.addDivision(Division.D256()).addKey(Key.MajorInC()).addTime(Time.Beat44()); attributes.addStaves(2).addClef(Clef.G(1)).addClef(Clef.F(2)); measure.addAttributes(attributes); part.addMeasure(measure); //音符 Note note = new Note(); note.addPitch(new Step("C"), new Alter(0), new Octave(4)); note.addDuration(1024); note.addType(Type.TYPE_whole); note.addStaff(1); measure.addNote(note); //转换到xml格式 String s = scorePartwise.toXML(); scorePartwise.toFile("music1.xml"); System.out.println(s); } } ``` 生成的音乐描述文件musicxml格式文件如下: ``` music1 piano 256 0 major 2 G 2 C 4 C 0 4 1024 whole 1 ``` 用musescore软件渲染结果如下: ![输入图片说明](https://images.gitee.com/uploads/images/2021/0814/232710_51c07128_617934.png "屏幕截图.png") ### 二、midi文件格式生成 midi文件是存储乐器事件的数据结构,生成一个midi格式的文件如下: ``` package midi.test; import midi.MidiFile; import midi.mthd.MThd; import midi.mtrk.MTrk; import midi.mtrk.event.midievent.FinalEvent; import midi.mtrk.event.midievent.KeyPressEvent; import java.io.FileOutputStream; import java.io.IOException; public class MiDiFileTest { static MThd testMthd() { //midi文件头部 MThd mThd = new MThd(); //同步多音轨 mThd.midiType = 1; //轨道数目 mThd.mtrkNum = 1; //四分音符持续时间 mThd.tickTime = 120; //内部字节 byte[] bytes = mThd.getByte(); //打印 for (int i = 0; i <= bytes.length - 1; i = i + 1) { System.out.print(Integer.toHexString(bytes[i]) + " "); } return mThd; } static MTrk testMTrk() { //新建一条音轨 MTrk mTrk = new MTrk(); //添加事件 mTrk.addEvent(new KeyPressEvent(240, 1, 66, 100)); mTrk.addEvent(new KeyPressEvent(240, 1, 66, 100)); mTrk.addEvent(new KeyPressEvent(240, 1, 66, 100)); mTrk.addEvent(new KeyPressEvent(240, 1, 66, 100)); mTrk.addEvent(new FinalEvent(240)); //转换到字节 byte[] bytes = mTrk.getByte(); //打印 for (int i = 0; i <= bytes.length - 1; i = i + 1) { System.out.print(Integer.toHexString(bytes[i]) + " "); } return mTrk; } static void midiTest() throws IOException { //创建MiDI文件 MidiFile midiFile = new MidiFile(); //设置头部 midiFile.setmThd(testMthd()); //添加音轨 midiFile.addMTrk(testMTrk()); //写出字节 midiFile.write(new FileOutputStream("d:\\test.midi")); } public static void main(String[] args) throws IOException { midiTest(); } } ``` 生成效果: