我正在使用DryWetMidi库来处理一些MIDI数据。
首先,我从剪贴板获取MIDI数据作为MemoryStream:
MemoryStream ms = (MemoryStream)Clipboard.GetDataObject().GetData("Standard MIDI File");
MidiFile mid = MidiFile.Read(ms);
然后我用midi做一些事情:
mid.RemoveNotes(n => n.NoteName == NoteName.FSharp);
现在,我想将其写回到剪贴板。我设法做到了这一点:
using (FileStream file = new FileStream("file.mid", FileMode.Create, FileAccess.
{
mid.Write(file);
}
using (MemoryStream ms2 = new MemoryStream())
using (FileStream file = new FileStream("file.mid", FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
ms2.Write(bytes, 0, (int)file.Length);
Clipboard.Clear();
Clipboard.SetData(midiFormat, ms2);
}
File.Delete("file.mid");
如您所见,首先将MIDI写入一个文件,然后将该文件读取到MemoryStream中,然后再将其写入剪贴板。这没有多大意义,因为直接将其写入MemoryStream会更简单。另外,我不想将文件写入用户文件系统。但是有问题。我这样尝试过:
using (MemoryStream ms2 = new MemoryStream())
{
mid.Write(ms2);
}
这不会给我一个错误,但是MemoryStream完全为空。调用ms2.Length会生成一个System.ObjectDisposedException
。
如何将midi直接写入MemoryStream?
编辑:这是DryWetMidi Write()方法的链接。
第二次修改:这是一段无效的代码:
MemoryStream ms = (MemoryStream)Clipboard.GetDataObject().GetData(midiFormat);
MidiFile mid = MidiFile.Read(ms);
mid.RemoveNotes(n => n.NoteName == NoteName.FSharp);
MemoryStream ms2 = new MemoryStream();
mid.Write(ms2);
var T = ms2.Length; //This will throw an exception
第三次编辑:我100%确保发布的代码与我正在运行的代码完全相同。这是StackTrace。 (要点是因为格式化在SO上很糟糕)。
答案 0 :(得分:3)
据我所知,DryWetMidi使用BinaryWriter
写入流。并且BinaryWriter
的默认行为是,当它被处置时,它也将处置该流。
处理完MemoryStream后,您将无法读取它,但可以调用ToArray()
。
byte[] result;
using (MemoryStream ms2 = new MemoryStream())
{
mid.Write(ms2);
result = ms2.ToArray();
}