495 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			495 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Factor
		
	
	
USING: io.encodings.binary io.streams.byte-array midi
 | 
						|
midi.private sequences tools.test ;
 | 
						|
 | 
						|
! variable-width numbers
 | 
						|
{
 | 
						|
    {
 | 
						|
        0x00
 | 
						|
        0x40
 | 
						|
        0x7f
 | 
						|
        0x80
 | 
						|
        0x2000
 | 
						|
        0x3fff
 | 
						|
        0x4000
 | 
						|
        0x100000
 | 
						|
        0x1fffff
 | 
						|
        0x200000
 | 
						|
        0x08000000
 | 
						|
        0x0fffffff
 | 
						|
    }
 | 
						|
} [
 | 
						|
    {
 | 
						|
        B{ 0x00 }
 | 
						|
        B{ 0x40 }
 | 
						|
        B{ 0x7f }
 | 
						|
        B{ 0x81 0x00 }
 | 
						|
        B{ 0xC0 0x00 }
 | 
						|
        B{ 0xff 0x7f }
 | 
						|
        B{ 0x81 0x80 0x00 }
 | 
						|
        B{ 0xC0 0x80 0x00 }
 | 
						|
        B{ 0xff 0xff 0x7f }
 | 
						|
        B{ 0x81 0x80 0x80 0x00 }
 | 
						|
        B{ 0xC0 0x80 0x80 0x00 }
 | 
						|
        B{ 0xff 0xff 0xff 0x7f }
 | 
						|
    } [ binary [ read-number ] with-byte-reader ] map
 | 
						|
] unit-test
 | 
						|
 | 
						|
{
 | 
						|
    {
 | 
						|
        B{ 0x00 }
 | 
						|
        B{ 0x40 }
 | 
						|
        B{ 0x7f }
 | 
						|
        B{ 0x81 0x00 }
 | 
						|
        B{ 0xC0 0x00 }
 | 
						|
        B{ 0xff 0x7f }
 | 
						|
        B{ 0x81 0x80 0x00 }
 | 
						|
        B{ 0xC0 0x80 0x00 }
 | 
						|
        B{ 0xff 0xff 0x7f }
 | 
						|
        B{ 0x81 0x80 0x80 0x00 }
 | 
						|
        B{ 0xC0 0x80 0x80 0x00 }
 | 
						|
        B{ 0xff 0xff 0xff 0x7f }
 | 
						|
    }
 | 
						|
} [
 | 
						|
    {
 | 
						|
        0x00
 | 
						|
        0x40
 | 
						|
        0x7f
 | 
						|
        0x80
 | 
						|
        0x2000
 | 
						|
        0x3fff
 | 
						|
        0x4000
 | 
						|
        0x100000
 | 
						|
        0x1fffff
 | 
						|
        0x200000
 | 
						|
        0x08000000
 | 
						|
        0x0fffffff
 | 
						|
    } [ binary [ write-number ] with-byte-writer ] map
 | 
						|
] unit-test
 | 
						|
 | 
						|
! format: 0
 | 
						|
{
 | 
						|
    T{ midi
 | 
						|
        { header
 | 
						|
            T{ midi-header
 | 
						|
                { format 0 }
 | 
						|
                { #chunks 1 }
 | 
						|
                { division 96 }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        { chunks
 | 
						|
            {
 | 
						|
                T{ midi-track
 | 
						|
                    { events
 | 
						|
                        {
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "time-signature" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "clocks-per-tick" 24 }
 | 
						|
                                        { "denominator" 4 }
 | 
						|
                                        { "numerator" 4 }
 | 
						|
                                        {
 | 
						|
                                            "notated-32nd-notes-per-beat"
 | 
						|
                                            8
 | 
						|
                                        }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "set-tempo" }
 | 
						|
                                { value 500000 }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 5 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 46 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 70 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 48 }
 | 
						|
                                        { "velocity" 96 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 60 }
 | 
						|
                                        { "velocity" 96 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 96 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 67 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 96 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 76 }
 | 
						|
                                        { "velocity" 32 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 192 }
 | 
						|
                                { name "note-off" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 48 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-off" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 60 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-off" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 67 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-off" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 76 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "end-of-track" }
 | 
						|
                                { value t }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} [
 | 
						|
    B{
 | 
						|
        0x4D 0x54 0x68 0x64
 | 
						|
            0x00 0x00 0x00 0x06
 | 
						|
            0x00 0x00
 | 
						|
            0x00 0x01
 | 
						|
            0x00 0x60
 | 
						|
 | 
						|
        0x4D 0x54 0x72 0x6B
 | 
						|
            0x00 0x00 0x00 0x3B
 | 
						|
            0x00 0xFF 0x58 0x04 0x04 0x02 0x18 0x08
 | 
						|
            0x00 0xFF 0x51 0x03 0x07 0xA1 0x20
 | 
						|
            0x00 0xC0 0x05
 | 
						|
            0x00 0xC1 0x2E
 | 
						|
            0x00 0xC2 0x46
 | 
						|
            0x00 0x92 0x30 0x60
 | 
						|
            0x00 0x3C 0x60
 | 
						|
            0x60 0x91 0x43 0x40
 | 
						|
            0x60 0x90 0x4C 0x20
 | 
						|
            0x81 0x40 0x82 0x30 0x40
 | 
						|
            0x00 0x3C 0x40
 | 
						|
            0x00 0x81 0x43 0x40
 | 
						|
            0x00 0x80 0x4C 0x40
 | 
						|
            0x00 0xFF 0x2F 0x00
 | 
						|
    } >midi
 | 
						|
] unit-test
 | 
						|
 | 
						|
! format: 1
 | 
						|
{
 | 
						|
    T{ midi
 | 
						|
        { header
 | 
						|
            T{ midi-header
 | 
						|
                { format 1 }
 | 
						|
                { #chunks 4 }
 | 
						|
                { division 96 }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        { chunks
 | 
						|
            {
 | 
						|
                T{ midi-track
 | 
						|
                    { events
 | 
						|
                        {
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "time-signature" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "clocks-per-tick" 24 }
 | 
						|
                                        { "denominator" 4 }
 | 
						|
                                        { "numerator" 4 }
 | 
						|
                                        {
 | 
						|
                                            "notated-32nd-notes-per-beat"
 | 
						|
                                            8
 | 
						|
                                        }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "set-tempo" }
 | 
						|
                                { value 500000 }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 384 }
 | 
						|
                                { name "end-of-track" }
 | 
						|
                                { value t }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                T{ midi-track
 | 
						|
                    { events
 | 
						|
                        {
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 5 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 192 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 76 }
 | 
						|
                                        { "velocity" 32 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 192 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 76 }
 | 
						|
                                        { "velocity" 0 }
 | 
						|
                                        { "channel" 0 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "end-of-track" }
 | 
						|
                                { value t }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                T{ midi-track
 | 
						|
                    { events
 | 
						|
                        {
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 46 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 96 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 67 }
 | 
						|
                                        { "velocity" 64 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 288 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 67 }
 | 
						|
                                        { "velocity" 0 }
 | 
						|
                                        { "channel" 1 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "end-of-track" }
 | 
						|
                                { value t }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                T{ midi-track
 | 
						|
                    { events
 | 
						|
                        {
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "program-change" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "program" 70 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 48 }
 | 
						|
                                        { "velocity" 96 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 60 }
 | 
						|
                                        { "velocity" 96 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 384 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 48 }
 | 
						|
                                        { "velocity" 0 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ midi-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "note-on" }
 | 
						|
                                { value
 | 
						|
                                    H{
 | 
						|
                                        { "note" 60 }
 | 
						|
                                        { "velocity" 0 }
 | 
						|
                                        { "channel" 2 }
 | 
						|
                                    }
 | 
						|
                                }
 | 
						|
                            }
 | 
						|
                            T{ meta-event
 | 
						|
                                { delta 0 }
 | 
						|
                                { name "end-of-track" }
 | 
						|
                                { value t }
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} [
 | 
						|
    B{
 | 
						|
        0x4D 0x54 0x68 0x64
 | 
						|
            0x00 0x00 0x00 0x06
 | 
						|
            0x00 0x01
 | 
						|
            0x00 0x04
 | 
						|
            0x00 0x60
 | 
						|
 | 
						|
        0x4D 0x54 0x72 0x6B
 | 
						|
            0x00 0x00 0x00 0x14
 | 
						|
            0x00 0xFF 0x58 0x04 0x04 0x02 0x18 0x08
 | 
						|
            0x00 0xFF 0x51 0x03 0x07 0xA1 0x20
 | 
						|
            0x83 0x00 0xFF 0x2F 0x00
 | 
						|
 | 
						|
        0x4D 0x54 0x72 0x6B
 | 
						|
            0x00 0x00 0x00 0x10
 | 
						|
            0x00 0xC0 0x05
 | 
						|
            0x81 0x40 0x90 0x4C 0x20
 | 
						|
            0x81 0x40 0x4C 0x00
 | 
						|
            0x00 0xFF 0x2F 0x00
 | 
						|
 | 
						|
        0x4D 0x54 0x72 0x6B
 | 
						|
            0x00 0x00 0x00 0x0F
 | 
						|
            0x00 0xC1 0x2E
 | 
						|
            0x60 0x91 0x43 0x40
 | 
						|
            0x82 0x20 0x43 0x00
 | 
						|
            0x00 0xFF 0x2F 0x00
 | 
						|
 | 
						|
        0x4D 0x54 0x72 0x6B
 | 
						|
            0x00 0x00 0x00 0x15
 | 
						|
            0x00 0xC2 0x46
 | 
						|
            0x00 0x92 0x30 0x60
 | 
						|
            0x00 0x3C 0x60
 | 
						|
            0x83 0x00 0x30 0x00
 | 
						|
            0x00 0x3C 0x00
 | 
						|
            0x00 0xFF 0x2F 0x00
 | 
						|
    } >midi
 | 
						|
] unit-test
 |