diff options
Diffstat (limited to 'midicsv-1.1/torture.pl')
| -rw-r--r-- | midicsv-1.1/torture.pl | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/midicsv-1.1/torture.pl b/midicsv-1.1/torture.pl new file mode 100644 index 0000000..f37e44d --- /dev/null +++ b/midicsv-1.1/torture.pl @@ -0,0 +1,173 @@ + +# Generate "torture test" for MidiCSV / CSVmidi + +# The output is a CSV file written on standard output +# which should be fed to through CSVMIDI and MIDICSV +# and the output compared. + + srand(1234); # Make pseudorandom sequences repeatable + + print << 'EOD'; + +; + ; MIDIcsv Torture Test + # +0, 0, Header, 1, 4, 480 +1, 0, Start_track +1, 0, TiTlE_t, "MidiCSV Torture Test" +1,0, copyRight_t, "© 1808 L. van Beethoven. This document is in the public domain." +1, 0, SMPTE_offset, 96, 0, 0, 0, 0 +1, 0, key_signature, 0, minor +1, 0, Time_signature, 4, 2, 24, 8 +1, 100, Text_t, "The tempo varies somewhat in this passage." +1, 482, Tempo, 335977 +1, 961, Tempo, 333493 +1, 1442, Tempo, 333319 +1, 10578, End_track +2, 0, Start_track +2, 0, Sequence_number, 64000 +2, 0, MIDI_port, 0 +2, 0, Instrument_Name_t, "Brass Section" +2, 0, Program_c, 1, 61 +2, 259, marker_T, "Bom bom bom..." +2, 259, Lyric_t, "Bom" +2, 259, Note_on_c, 1, 67, 104 +2, 501, Note_off_c, 1, 67, 0 +2, 525, Lyric_t, "Bom" +2, 525, Note_on_c, 1, 67, 104 +2, 740, Note_on_c, 1, 67, 0 +2, 764, Lyric_t, "Bom" +2, 764, Note_on_c, 1, 67, 104 +2, 978, Note_on_c, 1, 67, 0 +2, 1000, Marker_t, "...BOM!" +2, 1003, Lyric_t, "BOMMMMM!" +2, 1003, Note_on_c, 1, 63, 104 +2, 4809, Note_on_c, 1, 63, 0 + # Second 4 notes +2, 4850, Cue_point_t, "Conductor falls off podium" +2, 5047, Instrument_name_t, """Rock"" Organ" +2, 5048, Program_c, 1, 18 +2, 5048, Note_on_c, 1, 65, 104 +2, 5100, pitch_bend_c, 1, 10000 +2, 5100, channel_aftertouch_c, 1, 127 +2, 5200, pitch_bend_c, 1, 4000 +2, 5289, note_off_c, 1, 65, 0 +2, 5300, Control_c, 1, 91, 120 +2,5300, Control_c, 1, 7, 40 +2, 5311, Note_on_c, 1, 65, 104 +2,5400,pitch_BEND_c,1,0 +2, 5526, Note_on_c, 1, 65, 0 +2, 5540, control_c, 1, 7, 127 +2,5540, control_c, 1, 10, 0 +2, 5549, Pitch_Bend_c, 1,8192 +2, 5549, Note_on_c, 1, 65, 104 +2, 5766, Note_on_c, 1, 65, 0 +2,5790, control_c, 1, 10, 127 +2, 5790, Note_on_c, 1, 62, 104 +2, 9000, Poly_aftertouch_c, 1, 62, 127 +2, 10578, Note_off_c, 1, 62, 0 +2, 10578, End_track +3, 0, Start_track +3, 10578, End_track +4, 0, Start_Track +4, 10, Channel_prefix, 1 +4, 400, System_exclusive, 10, 0, 255, 127, 30, 96, 255, 224, 108, 31, 0 +4, 510, System_exclusive, 4, 0, 121, 31, 19 +4, 1071, channel_prefix, 15 +4, 1071, System_exclusive_packet, 10, 255, 18, 33, 111, 0, 77, 201, 7, 4, 255 +4, 1076, System_exclusive_packet, 0 +4, 1108, System_exclusive_packet, 3, 0, 0, 0 +4, 2000, Sequencer_specific, 10, 80, 211, 54, 71, 229, 0, 13, 128, 12, 40 +4, 2020, Sequencer_specific, 0 +4, 3000, Unknown_meta_event, 121, 9, 39, 201, 118, 6, 91, 223, 0, 78, 56 +; The following event is actually + ; 4, 3030, Key_signature, -4, "major" +# coded as an Unknown_meta_event. +4, 3100, Unknown_meta_event, 89, 2, 252, 0 +EOD + + # Now programmatically generate some long strings + # and byte vectors to push the limits. + + # Moderately long Sysex + $n = 5123; + print("4, 4000, System_exclusive, $n"); + &obytes($n); + print("\n"); + + # Moderately long pure ASCII text string + $n = 11213; + print("4, 4100, Text_t, \""); + for ($i = 0; $i < $n; $i ++) { + $r = chr(ord(' ') + int(rand(127 - ord(' ')))); + if ($r eq '"') { + print('"'); + } elsif ($r eq '\\') { + print('\\'); + } + print("$r"); + } + print("\"\n"); + + # Rather long arbitrary text string + print("4, 4200, Text_t, "); + &ostring(74219); + print("\n"); + + # Really long Sequence_specific + $n = 3497861; # 250,000th prime! + print("4, 4300, Sequencer_specific, $n"); + &obytes($n); + print("\n"); + + # Really long arbitrary text string + print("4, 4400, Lyric_t, "); + &ostring(4256233); # 300,000th prime! + print("\n"); + + # Wind up the track and the file with canned data + + print << 'EOD'; +4,10500, End_track +0, 0, End_of_file +EOD + + # Generate a random character string containing all + # byte values from 0 through 255. The argument gives + # the length in bytes to generate. + + sub ostring + { + local ($howlong) = @_; + local ($i, $r); + + print('"'); + for ($i = 0; $i < $howlong; $i ++) { + $r = chr(int(rand(256))); + if ($r eq '"') { + print('"'); + } elsif ($r eq '\\') { + print('\\'); + } elsif ((ord($r) < ord(' ')) || + ((ord($r) >= 127) && (ord($r) <= 160))) { + printf("\\%03o", ord($r)); + next; + } + print("$r"); + } + print('"'); + } + + # Generate a byte sequence whose length is + # given by the argument. + + sub obytes + { + local ($howlong) = @_; + local ($i, $r); + + for ($i = 0; $i < $howlong; $i ++) { + $r = int(rand(256)); + print(", $r"); + } + } |
