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)); }
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); }
public MidiData(HeaderChunk header, TracksIn tracks) { this.header = header; this.tracks = tracks.ToList().AsReadOnly(); }