java测试编写midi文件,总多一个全音休止符

问题,制作midi文件后,将其倒入西贝柳斯软件中看乐谱发现总多出一个小节,小节用全因休止符占位;
原因:写midi的时候切记音符时间戳一定要从0开始计算那,被特么坑死了;

/**
 * 测试写出midi文件
 * 音符样例 音符的音高 0-127(48是C大调的do。48,50,52,53,55,57,59就是do re,mi,fa,so,la,xi)
 * 音符样例 音符的音高 0-127(60是中间C的do。60,62,64,65,67,69,71就是do re,mi,fa,so,la,xi)
 */
public static void writeTest00() {
        try {
            int channel = 6;
            int resolution = 64;
            System.out.println("resolution:"+resolution);
            int resolution2 = 32;
            System.out.println("resolution2:"+resolution2);
            int start = 0;//就这块在计算时间戳开始一定要从0开始
            int stop = 63;
            int sound = 100;
            int inFu = 60;
            Sequence seq = new Sequence(Sequence.PPQ, resolution);
            Track track = seq.createTrack();
            for(int i = 1;i<=5;i++){
                ShortMessage a = new ShortMessage();
                ShortMessage b = new ShortMessage();
                switch (i){
                    case 1:
                        inFu = 60;
                        break;
                    case 2:
                        inFu = 62;
                        start = stop+1;
                        stop = start+resolution-1;
                        break;
                    case 3:
                        inFu = 64;
                        start = stop+1;
                        stop = start+resolution2-1;
                        break;
                    case 4:
                        inFu = 65;
                        start = stop+1;
                        stop = start+resolution2-1;
                        break;
                    case 5:
                        start = stop+1;
                        stop = start+resolution-1;
                        inFu = 67;
                        break;
                }
                //开
                System.out.println("start:"+start);
                a.setMessage(144,channel,inFu,sound);
                MidiEvent noteOn=new MidiEvent(a,start);
                track.add(noteOn);
                //停
                System.out.println("stop:"+stop);
                b.setMessage(128,channel,inFu,sound);
                MidiEvent noteOff=new MidiEvent(b,stop);
                track.add(noteOff);
            }

//            writeFile(seq);
            Sequencer player = MidiSystem.getSequencer();
            player.setTempoInBPM(48);
            player.open();
			player.setSequence(seq);
			player.start();
			while (player.isRunning()) {
				try {
					Thread.sleep(1000);
				} catch (Exception e) {
				}
			}
			player.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 public static final String RESOURCE_PREFIX = "/profile";
/**
     * 写文件
     * @param seq
     */
    public static String writeFile(Sequence seq){
        String filePath = "";
        try {
            String baseDir = "/usr/local/project/uploadPath";
            if (StringUtils.isEmpty(baseDir)){
                logger.info("未获取到baseDir");
                return null;
            }
            String truePath = baseDir+"/upload";
            String datePath = DateUtils.datePath() + "/";
            String mName = IdUtils.fastUUID() + ".mid";
            String midiName = datePath + mName;
            String folderPath = truePath + "/" + datePath;
            logger.info("folderPath:"+folderPath);
            File folderFile = new File(folderPath);
            if (!folderFile.exists()){
                folderFile.mkdirs();
            }
            String writePath = truePath+"/"+midiName;
            logger.info("写入地址:"+writePath);
            File file = new File(writePath);
            MidiFileWriter writer = new StandardMidiFileWriter();
            writer.write(seq, 0, file);
            int dirLastIndex = baseDir.length() + 1;
            String currentDir = StringUtils.substring(truePath, dirLastIndex);
            String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + midiName;
            logger.info("pathFileName:http://localhost:8080/platform"+pathFileName);
            filePath = pathFileName;
        }catch (Exception e){
            e.printStackTrace();
        }
        return filePath;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是一个简单的Android录制MIDI文件的demo,你可以参考一下: 1. 在Android Studio中创建一个新的项目 2. 在MainActivity.java文件中添加以下代码: ``` import android.media.midi.MidiDeviceInfo; import android.media.midi.MidiDevice; import android.media.midi.MidiManager; import android.media.midi.MidiOutputPort; import android.media.midi.MidiReceiver; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; import java.io.IOException; public class MainActivity extends AppCompatActivity { private static final String TAG = "MidiRecorder"; private MidiManager mMidiManager; private MidiDevice mMidiDevice; private MidiOutputPort mMidiOutputPort; private MidiRecorder mMidiRecorder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMidiManager = (MidiManager) getSystemService(MIDI_SERVICE); if (mMidiManager == null) { Log.e(TAG, "MIDI not supported on this device"); return; } MidiDeviceInfo[] infos = mMidiManager.getDevices(); if (infos.length == 0) { Log.e(TAG, "No MIDI devices found"); return; } // Choose the first device mMidiDevice = mMidiManager.openDevice(infos[0], null); if (mMidiDevice == null) { Log.e(TAG, "Failed to open MIDI device"); return; } // Get the first output port mMidiOutputPort = mMidiDevice.getOutputPort(0); if (mMidiOutputPort == null) { Log.e(TAG, "Failed to open MIDI output port"); return; } // Create a MIDI recorder mMidiRecorder = new MidiRecorder(mMidiOutputPort); // Start recording try { mMidiRecorder.startRecording(); } catch (IOException e) { Log.e(TAG, "Failed to start recording", e); return; } // Wait for 30 seconds try { Thread.sleep(30000); } catch (InterruptedException e) { Log.e(TAG, "Interrupted while sleeping", e); } // Stop recording try { mMidiRecorder.stopRecording(); } catch (IOException e) { Log.e(TAG, "Failed to stop recording", e); } } @Override protected void onDestroy() { super.onDestroy(); if (mMidiRecorder != null) { try { mMidiRecorder.stopRecording(); } catch (IOException e) { Log.e(TAG, "Failed to stop recording", e); } } if (mMidiOutputPort != null) { mMidiOutputPort.close(); } if (mMidiDevice != null) { mMidiDevice.close(); } } private static class MidiRecorder implements MidiReceiver { private static final int BUFFER_SIZE = 1024; private final MidiOutputPort mOutputPort; private final byte[] mBuffer; private final long[] mTimestamps; private int mCount; public MidiRecorder(MidiOutputPort outputPort) { mOutputPort = outputPort; mBuffer = new byte[BUFFER_SIZE]; mTimestamps = new long[BUFFER_SIZE]; mCount = 0; } public void startRecording() throws IOException { mOutputPort.connect(this); } public void stopRecording() throws IOException { mOutputPort.disconnect(this); } @Override public void onSend(byte[] data, int offset, int count, long timestamp) throws IOException { if (mCount + count > BUFFER_SIZE) { Log.w(TAG, "Buffer overflow"); mCount = 0; } System.arraycopy(data, offset, mBuffer, mCount, count); mTimestamps[mCount] = timestamp; mCount += count; } public void saveToFile(String filename) throws IOException { // TODO: Save the MIDI data to a file } } } ``` 3. 在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> ``` 请注意,这只是一个简单的demo,你需要根据自己的需求对代码进行修改和完善。如果你遇到了问题,可以在评论区提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请看我头像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值