NAME
Types::MIDI - Type library for MIDI
VERSION
version v0.0.3
SYNOPSIS
use Moo;
use Types::MIDI -all;
has volume => (
is => 'ro',
isa => Velocity,
default => 100,
);
has a440 => (
is => 'ro',
isa => Note,
default => 69,
);
has electric_snare => (
is => 'ro',
isa => PercussionNote,
coerce => 1,
default => 'Electric Snare',
);
DESCRIPTION
This is a type constraint library intended to be useful for those developing music software using the MIDI (Musical Instrument Digital Interface) specification.
It is a work in progress driven by real-world usage, and as such does not yet necessarily have a stable interface. Once it reaches version 1.0, though, the author does not intend to introduce any breaking changes without a corresponding increase in the major version number.
OVERVIEW
Because this leverages Type::Library, it should be usable in a variety of Perl object systems, including Moo and Moose. By default, it exports nothing into the consumer's namespace; however, in addition to specifying individual functions in the "use" in perlfunc statement, you can also provide or combine the following tags to export groups of functions:
use Types::MIDI qw(:types);
-
Exports all types by name into the namespace.
use Types::MIDI qw(:is);
-
Exports all
is_
TypeName functions into the namespace. use Types::MIDI qw(:assert);
-
Exports all
assert_
TypeName functions into the namespace. use Types::MIDI qw(:to);
-
Exports all
to_
TypeName functions into the namespace. use Types::MIDI qw(+
TypeName);
-
Exports TypeName and all related functions into the namespace.
use Types::MIDI qw(:all);
-
Exports everything.
This library also inherits from Exporter::Tiny; consult Exporter::Tiny::Manual::Importing for ways to customize how functions are imported, such as renaming or omitting certain names.
Also note that the tags listed above may be preceded with a -
(hyphen) instead of a :
(colon); Perl's auto-quoting of barewords thus enables you to import a tag group of functions like so:
use Types::MIDI -all;
TYPES
Channel
An integer from 0 to 15 corresponding to a MIDI Channel.
Velocity
An integer from 0 to 127 corresponding to a MIDI velocity.
Note
An integer from 0 to 127 corresponding to a MIDI note number.
PercussionNote
A "Note" from 27 through 87, corresponding to a "Note" number in the General MIDI 2 Percussion Sound Set.
This type can also coerce case-insensitive "NonEmptySimpleStr" in Types::Common::Strings of instrument names in the General MIDI 2 Percussion Sound Set, returning the corresponding "Note".
FUNCTIONS
is_Channel
Returns true if the passed value can be used as a "Channel".
assert_Channel
Returns the passed value if and only if it can be used as a "Channel"; otherwise it throws an exception.
is_Velocity
Returns true if the passed value can be used as a "Velocity".
assert_Velocity
Returns the passed value if and only if it can be used as a "Velocity"; otherwise it throws an exception.
is_Note
Returns true if the passed value can be used as a "Note".
assert_Note
Returns the passed value if and only if it can be used as a "Note"; otherwise it throws an exception.
is_PercussionNote
Returns true if the passed value can be used as a "PercussionNote".
assert_PercussionNote
Returns the passed value if and only if it can be used as a "PercussionNote"; otherwise it throws an exception.
to_PercussionNote
Coerces the passed value to a "PercussionNote".
SEE ALSO
MIDI 1.0 Detailed Specification (Document Version 4.2.1), revised February 1996 by the MIDI Manufacturers Association: https://midi.org/midi-1-0-core-specifications
Appendix B: GM 2 Percussion Sound Set in General MIDI 2 (Version 1.2a), published February 6, 2007 by the MIDI Manufacturers Association: https://midi.org/general-midi-2
BUGS
Please report any bugs or feature requests on the bugtracker website https://codeberg.org/mjgardner/perl-Types-MIDI/issues
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
Mark Gardner <mjgardner@cpan.org>
COPYRIGHT AND LICENSE
This software is copyright (c) 2025 by Mark Gardner.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.