public static MidiData parse(FileStream input_file_stream)
{
var input_binary_reader = new BinaryReader(input_file_stream);
HeaderChunk header_chunk;
ushort number_of_tracks;
{
var header_chunk_ID = stringEncoder.GetString(input_binary_reader.ReadBytes(4));
var header_chunk_size = BitConverter.ToInt32(input_binary_reader.ReadBytes(4).Reverse().ToArray <byte>(), 0);
var header_chunk_data = input_binary_reader.ReadBytes(header_chunk_size);
var format_type = BitConverter.ToUInt16(header_chunk_data.Take(2).Reverse().ToArray <byte>(), 0);
number_of_tracks = BitConverter.ToUInt16(header_chunk_data.Skip(2).Take(2).Reverse().ToArray <byte>(), 0);
var time_division = BitConverter.ToUInt16(header_chunk_data.Skip(4).Take(2).Reverse().ToArray <byte>(), 0);
header_chunk = new HeaderChunk(format_type, time_division);
}
var tracks =
Enumerable.Range(0, number_of_tracks)
.Select(track_number =>
{
var track_chunk_ID = stringEncoder.GetString(input_binary_reader.ReadBytes(4));
var track_chunk_size = BitConverter.ToInt32(input_binary_reader.ReadBytes(4).Reverse().ToArray <byte>(), 0);
var track_chunk_data = input_binary_reader.ReadBytes(track_chunk_size);
return(Tuple.Create(track_chunk_size, track_chunk_data));
}).ToList()
.Select(raw_track => new TrackChunk(parse_events(raw_track.Item2, raw_track.Item1)));
return(new MidiData(header_chunk, tracks));
}