The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Win32API::MIDI::SysEX - Perl Module for MIDI System Exclusive Message.

SYNOPSIS

  use Win32API::MIDI::SysEX;
  $se = new Win32API::MIDI::SysEX;
  $d = $se->turnGeneralMIDISystemOff;
  $d = $se->turnGeneralMIDISystemOn;
  $d = $se->masterVolume(0xD20);

DESCRIPTION

Overview

This module is still under development and most of function are not debugged yet. And the this module may have to be renamed as MIDI::SysEX in the future, since this module is dependent with Microsoft Windows.

Manufacturer's ID Number

MIDI manufacturer's ID is distributed as follows.

               not used  American  European  Japanese  Other     Special
    1 byte ID: 00        01 -- 1F  20 -- 3F  40 -- 5F  60 -- 7C  7D -- 7F
    3 byte ID: 00 00 00  00 00 01  00 20 00  00 40 00  00 60 00
                         00 1F 7F  00 3F 7F  00 5F 7F  00 7F 7F

    7D: non-commercial use (e.g. schools, research, etc.)
    7E: Non-Real Time Universal System Exclusive ID
    7F: Real Time Universal System Exclusive ID (all call device ID)

Standard MIDI System Exclusive Messages use LSB first (a kind of little endian) notation. By following this rule, a 3 byte ID "xxh yyh zzh" in MIDI specification is expressed as 0xzzyyxx in this module. By using this notation we can distinguish "01h" (Sequential: 0x01) from "00h 00h 01h" (Time Warner Interactive: 0x010000).

The following methods are provided.

manufacturer(ID)

Returns the manufacturer name for manufacturer's ID.

manufacturersID(name)

Returns the manufacturer ID whose manufacturer's name equals with name. Returns undef when no matches.

Device ID

The value for device ID option (argument) should be a number from 1 to 16 (not 0 to 15).

Create an Object

new Win32API::MIDI::SysEX([param => value,]...)
        deviceID [devID]:
                Device ID.  If device_ID is omitted, BRD+1 broadcast,
                all call, 127+1) is used.  The device ID is used on
                every method calls.  You can create any numbers of
                object with different device ID.

        manufacturersID [mID]:
                manufacturers ID.  If omitted, 0x7d (Non-commercail
                use) is used.

        manufacturerName [mName]:
                manufacturers name. It must be one of key of
                %Win32API::MIDI::mID

        modelID [mdlID]:
                MIDI device model ID

        modelName [mdlName]:
                MIDI device model name.

Sample Dump Standard

Generic Handshaking Messages

sampleDumpACK(pp_1B)
sampleDumpNAK(pp_1B)
sampleDumpCANCEL(pp_1B)
sampleDumpWAIT(pp_1B)
sampleDumpEOF(pp_1B)
  pp_1B:packet number (1 byte)

Dump Header

sampleDumpHeader(sample_number_2B, sample_format, sample_period_3B, sample_length_3B, sustain_loop_start_point_word_number_3B, sustain_loop_end_point_word_number_3B, loop_type)
  sample_format: # of significant bits from 8-28
  sample_period_3B: 1/sample_rate in nanosecond
  loop_type: 00=forward only, 01=backward/forward, 7f=loop off

Dump Request

sampleDumpRequest(requested_sample_2B)

Data Packet (for Sample Data)

sampleDataPacket(running_packet_count_1B, data)
  running_packet_count_1B: 0-127
  data: 120 bytes of data

Sample Dump Extensions

sampleDumpLoopPointTransmission(sample_number_2B, loop_number_2B, loop_type, loop_start_address_3B, loop_end_address_3B);
  loop_type:
        00 = Forwards Only (unidirectional)
        01 = Backwards/Forwards (bi-directional)
        7F = Off
sampleDumpLoopPointRequest(sample_number_2B, loop_number_2B)

Device Inquiry

identityRequest(void)
identityReply(manufacturer's_ID, device_family_code_2B, device_family_member_code_2B, software_revision_level_4B)
    manufacturer's_ID : 1 or 3 byte ID
parseIdentityReply(identity_reply_data)

parseIdentityReply() returns list of;

        device ID (1 byte)
        manufactures ID (1 byte or 3 byte)
        device family code (2 byte)
        device family member code (2 byte)
        software revision level (4 byte)

Or returns NULL list if data format of identity_reply_data is illegal.

File Dump

Request

fileDumpRequest(receiver_ID_1B, type [,file_name])
  type:
        "MIDI" : MIDI File
        "MIEX" : MIDIEX File
        "ESEQ" : ESQ File
        "TEXT" : 7-bit ASCII Text File
        "BIN " : binary file
        "MAC " : Macintosh file (with MacBinary header)

Returns undef if type or file_name is illegal value.

fileDumpHeader(sender_ID, type, length [,file_name])
  type: see fileDumpRequest().

Data Packet (for File Dump)

fileDumpDataPacket(pp_1B, data)

Maximum data length is 112 byte.

Handshaking Flags

fileDumpNAK(pp_1B)
fileDumpACK(pp_1B)
fileDumpWAIT(pp_1B)
fileDumpCANCEL(pp_1B)
fileDumpEOF(pp_1B)
  pp_1B:packet number (1 byte)

MIDI Tuning

Bulk Tuning Dump Request

bulkTuningDumpRequest(pn_1B)
    pn: tuning program number (0-127)

Bulk Tuning Dump

bulkTuningDump(pn_1B, tuning_name, data)
    pn: tuning program number (0-127)
    tuning_name: 16 ASCII characters
    data: 3 x 128 bytes frequency data

Single Note Tuning Change (Real-Time)

singleNoteTuningChange(pn_1B, nc_1B, data)
    pn: tuning program number (0-127)
    nc: number of changes
    data: 4 x nc bytes data

General MIDI System Messages

Turn General MIDI System On

GM1SystemOn(void)
GM2SystemOn(void)

Turn General MIDI System Off

GMSystemOff(void)

Notation Information

Bar Maker

notationInfoBarMarker(bar_number_2B)
    bar_number:
        0x2000                  not running
        0x2001 - 0x0000         count-in
        0x0001 - 0x1FFE         bar number in song
        0x1FFF                  running: bar number unknown

Time Signature

notationInfoTimeSignatureImmediate(nb0_1B, bd0_1B, nc_1B, nn_1B [,nb1_1B, bd1_1B]...)
notationInfoTimeSignatureDelayed(nb0_1B, bd0_1B, nc_1B, nn_1B [,nb1_1B, bd1_1B]...)
   nbn : number of beats (numerator) of time signature
   bdn : beat value (denominator) of time signature (negative power of 2)
   nc  : number of MIDI clocks in a metronome click
   nn  : number of notated 32nd notes in a MIDI quarter note

   Example
     3/4       : nb0 = 3, bd0 = 2
     4/4 + 3/8 : nb0 = 4, bd0 = 2, nb1 = 3, bd1 = 3

Device Control

Master Volume and Master Balance

masterVolume(volume_2B)
    volume :
      0x0000 = volume off
      0x3FFF = maximum volume
masterBalance(balance_2B)
    balance :
      0x0000 = hard left
      0x2000 = center
      0x3fff = hard right
globalParameterReverb(parameter_1B, value_1B) (GM2)
    parameter = 0: Reverb Type
        0: small room
        1: medium room
        2: large room
        3: medium hall
        4: large hall (default)
        5: plate

    parameter = 1: Reverb Time
        0: 44 (1.1s)
        1: 50 (1.3s)
        2: 56 (1.5s)
        3: 64 (1.8s)
        4: 64 (1.8s)
        8: 50 (1.3s)
globalParameterChorus(parameter_1B, value_1B) (GM2)
    parameter = 0: Chorus Type
        0: Chorus 1
        1: Chorus 2
        2: Chorus 3
        3: Chorus 4
        4: FB Chorus
        5: Flanger

    parameter = 1: Modulation Rate
        MR = value * 0.122 (MR: modulation frequency in Hz)

    parameter = 2: Modulation Depth
        MD = (value+1) / 3.2 (MD: peak-to-peak swing of modulation in ms)

    parameter = 3: Feedback
        FB = value * 0.763 (FB: amount of feedback from Chorus output in percent)

    parameter = 4: Send to Reverb
        CTR = value * 0.787 (CTR: send level from Chorus to Reverb in percent)
channelPressure(channel_1B, pp_1B, rr_1B [,pp_1B, rr_1B]...) (GM2)

Controller Destination Setting, Channel Pressure (Aftertouch)

  pp                            rr              description
  00 Pitch Control              0x28-0x58       -24 - +24 semitones
  01 Filter Cutoff Control      0x00-0x7f       -9600 - +9450 cents
  02 Amplitude Control          0x00-0x7f       0 - (127/64)*10 percent
  03 LFO Pitch Depth            0x00-0x7f       0 - 600 cents
  04 LFO Filter Depth           0x00-0x7f       0 - 2400 cents
  05 LFO Amplitude Depth        0x00-0x7f       0 - 100 percent
controlChange(channel_1B, cc_1B, pp_1B, rr_1B [,pp_1B, rr_1B]...) (GM2)

Controller Destination Setting, Controller (Control Change)

  cc : controller number 0x01 - 0x1f, 0x40 - 0x5f

  pp                            rr              description
  00 Pitch Control              0x28-0x58       -24 - +24 semitones
  01 Filter Cutoff Control      0x00-0x7f       -9600 - +9450 cents
  02 Amplitude Control          0x00-0x7f       0 - (127/64)*10 percent
  03 LFO Pitch Depth            0x00-0x7f       0 - 600 cents
  04 LFO Filter Depth           0x00-0x7f       0 - 2400 cents
  05 LFO Amplitude Depth        0x00-0x7f       0 - 100 percent

EXPORT

None by default. The following constant values can be exported.

System Exclusive Message
  SOX = 0xf0    # Start of System Exclusive Status
System Common Messages
  MQF = 0xf1    # MTC (MIDI Time Code) Quarter Frame
  SPP = 0xf2    # Song Position Pointer
  SSL = 0xf3    # Song Select
  TRQ = 0xf6    # Tune Request
  EOX = 0xf7    # EOX: End Of System Exclusive
System Real Time Messages
  CLK = 0xf8    # Timing Clock
  STT = 0xfa    # Start
  CNT = 0xfb    # Continue
  STP = 0xfc    # Stop
  ASN = 0xfe    # Active Sensing
  RST = 0xff    # System Reset
Special Manufacturer's IDs
  UNM = 0x7e    # Universal Non-realtime Messages
  URM = 0x7f    # Universal Realtime Messages
Special Device ID
  BRD = 0x7f    # Broadcast Device ID (all call)

AUTHOR

Hiroo Hayashi, <hiroo.hayashi@computer.org>

SEE ALSO

Win32API::MIDI
Win32API::MIDI::SysEX::Roland.pm, Win32API::MIDI::SysEX::Yamaha.pm, etc

TODO

Add more Subclasses other than Roland or Yamaha. Contributions are welcome.
More test and debug.
Implement MTC (MIDI Time Control), MSC (MIDI Show Control), and MMC (MIDI Machine Control) functions.

BUGS

If you find bugs, report to the author.