melanchall / drywetmidi

.NET library to read, write, process MIDI files and to work with MIDI devices
https://melanchall.github.io/drywetmidi
MIT License
523 stars 73 forks source link

Read multiple MIDI files from stream #244

Closed ZengRunMing closed 1 year ago

ZengRunMing commented 1 year ago

因为要将多个Midi文件的数据打包成一个文件,所以希望能够添加通过虚拟内存加载写入到MenoryStream中的Midi数据的功能

下面是根据反编译后自己添加的代码,但还没测试是否可行 A

melanchall commented 1 year ago

Hi,

Unfortunately, I don't understand you :-( Can you please write your question in English?

Thanks, Max

melanchall commented 1 year ago

@ZengRunMing Am I correct you have a feature suggestion to introduce a new Read method which accepts an offset from the start of a stream? Something like

MidiFile.Read(stream, offset);

I don't think we need the size parameter because it's not required to detect the end of a file.

melanchall commented 1 year ago

Well, if I understood you correctly, I think we don't need a new method. Just move to the desired position in the stream first

stream.Seek(count, from);

and then call

MidiFile.Read(stream);
ZengRunMing commented 1 year ago

It has been resolved, thank you

ZengRunMing commented 1 year ago

Next time, I will use a translator to send English because I am not very good at speaking English. This is written using a translator

melanchall commented 1 year ago

Well, I've just checked the way suggested by me and it doesn't work... So I need to handle your issue properly. I think I'll add

ExtraTrackChunkPolicy.StopReading

which can be specified in ReadingSettings which will tell DryWetMIDI to stop reading a file when required track chunks are read.

Thanks for the issue! I'll implement new policy as soon as I get back to my computer next week.

melanchall commented 1 year ago

@ZengRunMing Hi,

I've added StopReadingOnExpectedTrackChunksCountReached property to the ReadingSettings, so you can use this code:

MidiFile.Read(stream, new ReadingSettings
{
    StopReadingOnExpectedTrackChunksCountReached = true
});

This will force DryWetMIDI to stop when a file is read even if the input stream's end is not reached. So you can make the same call again and read following file from the stream.

New API is in prerelease NuGet-package – 7.0.0-prerelease1.

Thanks, Max

ZengRunMing commented 1 year ago

midi.zip By the way, I also discovered an issue where errors may occur when playing Midi files similar to those in compressed packages, as follows Error

melanchall commented 1 year ago

@ZengRunMing Please show the code you use to get this error. In the archive I see 4 files, but I suppose you get the error on one specific file, right?

ZengRunMing commented 1 year ago

Are these? Error ErrorCode

ZengRunMing commented 1 year ago

This problem arose before I changed the API, when I read Midi files directly from Read (string Path)

melanchall commented 1 year ago

What is ReadOnBytes? Where usage of the new API I've provided you via prerelease package? What is in MemoryStream? How your archive is related with this code? You didn't provide any details so I can't help you unfortunately.

ZengRunMing commented 1 year ago

This is the API version 6.4.1. There is currently no newly released API being used. The above code is used to call the method I added in the API after I changed it. The following figure shows the code added in the API. The Midi file in the ZIP file is imported through Cubase and then re exported. Only in this way can it run normally. I'm not sure if it's a coding issue. This issue also occurs when reading using file names. CODE

melanchall commented 1 year ago

Please send me the entire solution with all your code and hardcode usage of some file within it so I can just run solution and reproduce the error.

ZengRunMing commented 1 year ago

The file was too big to be sent out

melanchall commented 1 year ago

Unfortunately you didn't provide me details and I am forced to pull information from you. Sorry, but I have no time for this. So I recommend you to use new API I've prepared for you. If you have any other questions or problems, feel free to open new issues. And please read the Support article to learn how to get help quickly.

melanchall commented 1 year ago

:rocket: 7.0.0 version is released now!

Prerelease NuGet packages will be unlisted soon, so please update the package references to the new version.