# 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软件渲染结果如下:

### 二、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();
}
}
```
生成效果:
