diff options
-rw-r--r-- | spec/bsw.fspec | 5 | ||||
-rw-r--r-- | spec/flac.fspec | 172 | ||||
-rw-r--r-- | spec/midi.fspec | 14 | ||||
-rw-r--r-- | spec/riff.fspec | 18 |
4 files changed, 209 insertions, 0 deletions
diff --git a/spec/bsw.fspec b/spec/bsw.fspec new file mode 100644 index 0000000..5e868eb --- /dev/null +++ b/spec/bsw.fspec @@ -0,0 +1,5 @@ +struct v { + u8 header[4] | matches('CWS\0') str; + u32 size dec; + u8 data[until(false)] | compression('zlib', size) hex; +}; diff --git a/spec/flac.fspec b/spec/flac.fspec new file mode 100644 index 0000000..6ee85e9 --- /dev/null +++ b/spec/flac.fspec @@ -0,0 +1,172 @@ +enum { + STREAMINFO, + PADDING, + APPLICATION, + SEEKTABLE, + VORBIS_COMMENT, + CUESHEET, + PICTURE, + INVALID = 127 +}; + +struct utf8_string { + u32 length; + u8 string[length] | encoding('utf8') str; +}; + +struct ascii_string { + u32 length; + u8 string[length] | encoding('ascii') str; +}; + +struct flac { + u8 header[4] | matches('fLaC') str; + struct { + u1 last_metadata_block; + u7 block_type | range(STREAMINFO, INVALID); + u24 length; + select (block_type) { + STREAMINFO) + struct { + u16 min_block_size_in_samples; + u16 max_block_size_in_samples; + u24 min_frame_size_in_bytes; + u24 max_frame_size_in_bytes; + u20 sample_rate_in_hz; + u3 channels; + u5 bps; + u36 total_samples; + u128 md5 hex; + } streaminfo; + PADDING) + struct { + u8 zero[length] nul; + } padding; + APPLICATION) + struct { + u32 id; + u8 data[length] hex; + } application; + SEEKTABLE) + struct { + struct { + u64 sample_no; + u64 offset_in_bytes; + u16 num_samples; + } seekpoint[length / 18]; + } seektable; + VORBIS_COMMENT) + struct { + struct utf8_string vendor; + u32 user_comment_list_length; + struct utf8_string user_comment[user_comment_list_length]; + u1 framing_bit | matches(true); + } vorbis_comment le; + CUESHEET) + struct { + u8 catalog[128] | encoding('ascii') str; + u64 lead_in_samples; + u1 is_compact_disc; + u2071 reserved nul; + u8 num_tracks; + struct { + u64 offset_in_samples; + u8 index; + u8 isrc[12] | encoding('ascii') str; + u1 type; + u1 pre_emphasis; + u110 reserved nul; + u8 num_index_points; + struct { + u64 offset_in_samples; + u8 index; + u24 reserved; + } indices[num_index_points]; + } track[num_tracks]; + } cuesheet; + PICTURE) + struct { + u32 type; + struct ascii_string mime; + struct utf8_string description; + u32 width; + u32 height; + u32 color_depth_in_bps; + u32 num_colors_for_indexed; + u32 length; + u8 data[length] hex; + } picture; + *) + u8 any[length] hex; + } data; + } metadata[until (metadata.last_metadata_block)]; + struct { + u14 sync_code | matches(b11111111111110); + u1 reserved1 nul; + u1 blocking_strategy; + u4 block_size_in_inter_channel_samples; + u4 sample_rate; + u4 channel_assignment; + u3 sample_size_in_bits; + u1 reserved2 nul; + select (blocking_stragety) { + 0) u8 frame[reserved[1]] | encoding('utf8') hex; + 1) u8 sample['\0':6] | encoding('utf8') hex; + } index; + select (block_size_in_inter_channel_samples) { + b0110) u8 value1; + b0111) u16 value2; + } block_size_bit; + select (sample_rate) { + b1100) u8 value_in_kHz; + b1101) u16 value_in_Hz; + b1110) u16 value_in_tens_of_Hz; + } sample_rate_bit; + u8 crc_8 hex; + struct { + u1 padding nul; + u6 type; + u1 wasted_bits_per_sample[until (wasted_bits_per_sample)]; + select (type) { + // missing verbatim and lpc + b000000) + struct { + select (sample_size_in_bits) { + b000) u1 v[metadata[0].data.streaminfo.bps]; + b001) u8 v8; + b011) u12 v12; + b100) u16 v16; + b101) u20 v20; + b110) u24 v24; + } value; + } constant; + '001xxxx') + struct { + u1 warmup[bps * (type & 7)] hex; + struct { + u2 method_type; + select (method_type) { + b00) + struct { + u4 order; + struct { + // this format is annoying.. :D + u1 todo; + } partition; + } partitioned_rice; + b01) + struct { + u4 order; + struct { + // this format is annoying.. :D + u1 todo; + } partition; + } partitioned_rice2; + } method; + } residual; + } fixed; + } data; + } subframe; + u16 crc_16 hex; + } frame[until (false)]; +} be; diff --git a/spec/midi.fspec b/spec/midi.fspec new file mode 100644 index 0000000..2c46944 --- /dev/null +++ b/spec/midi.fspec @@ -0,0 +1,14 @@ +struct midi_track { + u8 type[4] | matches('MTrk') str; + u32 length; + u8 data[length]; +}; + +struct midi { + u8 type[4] | matches('MThd') str; + u32 length | matches(6); + u16 format; + u16 track_count; + u16 division; + struct midi_track tracks[track_count]; +}; diff --git a/spec/riff.fspec b/spec/riff.fspec new file mode 100644 index 0000000..39de9d3 --- /dev/null +++ b/spec/riff.fspec @@ -0,0 +1,18 @@ +struct riff_chunk { + u8 header[4] str; + u32 size; + // Needs union, for LIST header there is no data + // type: u8[4] str; + u8 data[size] hex; +}; + +struct riff_header { + u8 header[4] str; + u32 size; + u8 type[4] str; +}; + +struct riff { + struct riff_header header; + struct riff_chunk chunks[until (false)]; +}; |