mid是一种描述音频的文件,它记录的是音乐的乐谱,常见的音乐播放器可以直接播放mid文件。
下面用C#来做一个他们之间的转换。
注意这里txt的格式大概是这样的
4D 54 68 64 00 00 00 06 00 01
00 03 01 E0 4D 54
每一行数量没有上限,两个十六进制数之间用空格或者换行分隔开就OK
为什么必须是这样呢,只是因为我写的代码要求的,不是什么特定标准啦。
如果添加进去了一些别的奇奇怪怪的字符什么的,这个代码就得改。毕竟我只做了简单的字符处理
写这个有什么用呢,大概就是你可以通过midi文件得到乐谱,或者自己写乐谱生成midi吧(然而我对作曲一点都不了解hhh)
mid转txt
using System;
using System.IO;
namespace ConsoleApp1
{
class BinToChar
{
static void Main(string[] args)
{
//读
BinaryReader binaryReader;
FileStream fs = new FileStream("C:\\Users\\ann_l\\Downloads\\hgrywolf.mid", FileMode.Open);
binaryReader = new BinaryReader(fs);
long length = fs.Length;
byte[] bytes;
bytes = binaryReader.ReadBytes((int)length);
for (int i = 0; i < length; i++)
{
Console.Write("{0:x2} ", bytes[i]);
}
//写
if (!File.Exists("C:\\Users\\ann_l\\Downloads\\out.txt"))
{
File.Create("C:\\Users\\ann_l\\Downloads\\out.txt");
}
StreamWriter streamWriter = new StreamWriter("C:\\Users\\ann_l\\Downloads\\out.txt", true);
for (int i = 0; i < length; i++)
{
streamWriter.Write("{0:x2} ", bytes[i]);
}
}
}
}
txt转mid
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace ConsoleApp1
{
class CharToBin
{
static void Main(string[] args)
{
StreamReader streamReader = new StreamReader("C:\\Users\\ann_l\\Downloads\\souce.txt");
String input = streamReader.ReadToEnd();
input = input.Replace("\n", "");
input = input.Replace("\r", " ");
string[] inputs = input.Split(" ");
int len = inputs.Length;
byte[] bytes = new byte[len];
for (int i = 0; i < len - 1; i++)
{
bytes[i] = Convert.ToByte(inputs[i], 16);
}
FileStream fs = new FileStream("C:\\Users\\ann_l\\Downloads\\output.mid", FileMode.OpenOrCreate);
BinaryWriter binaryWriter = new BinaryWriter(fs);
fs.Write(bytes, 0, len);
fs.Close();
}
}
}
···