MIDI-SoundFont
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
SoundFont.pm view on Meta::CPAN
# MIDI::SoundFont.pm
#########################################################################
# This Perl module is Copyright (c) 2002, Peter J Billam #
# c/o P J B Computing, www.pjb.com.au #
# #
# This module is free software; you can redistribute it and/or #
# modify it under the same terms as Perl itself. #
#########################################################################
package MIDI::SoundFont;
no strict;
use bytes;
#my $debug = 1; use Data::Dumper;
$VERSION = '1.08';
$VERSION_DATE = '18may2013';
# 20130518 1.07 Makefile.PL specifies PREREQ_PM, to improve test results :-)
# 20130515 1.06 test.pl skips Gravis.zip test if String::Approx not installed
# 20120809 1.05 added the csound_scoresynth and csound_midisynth examples
# 20120322 1.04 pack a=zeropadded rather than A=spacepadded; introduce
# new_gf(), gravis2file now works, and make_bank5 does gravis too
# 20120320 1.03 new_sf(), and chCorrection is packed as signed
# 20120318 1.02 detect duplicate Preset,Inst,Sample names and uniquely rename
# 20120216 1.01 gravis2file writes .zip files
# 20120215 1.00 first released version
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
@EXPORT = ();
@EXPORT_OK = qw( GeneratorOperators GenAmountType bytes2sf file2sf
sf2bytes sf2file new_sf file2gravis gravis2file new_pat timidity_cfg
);
@EXPORT_CONSTS = qw(GeneratorOperators GenOpname2num GenAmountType
MODES_16BIT MODES_UNSIGNED MODES_LOOPING MODES_PINGPONG
MODES_REVERSE MODES_SUSTAIN MODES_ENVELOPE MODES_CLAMPED);
%EXPORT_TAGS = (ALL => [@EXPORT_OK], CONSTS => [@EXPORT_CONSTS]);
eval 'require File::Format::RIFF';
if ($@) {
die "you need to install the File::Format::RIFF module from www.cpan.org\n";
}
# local $[ = 0; # SoundFont indexes start at zero but setting $[ is deprecated
my %SampleName = (); # to avoid duplicating sample-names...
# ----------------------- exportable constants -----------------------
@GeneratorOperators = qw(
startAddrsOffset endAddrsOffset startloopAddrsOffset endloopAddrsOffset
startAddrsCoarseOffset modLfoToPitch vibLfoToPitch modEnvToPitch
initialFilterFc initialFilterQ modLfoToFilterFc modEnvToFilterFc
endAddrsCoarseOffset modLfoToVolume unused1 chorusEffectsSend
reverbEffectsSend pan unused2 unused3
unused4 delayModLFO freqModLFO delayVibLFO
freqVibLFO delayModEnv attackModEnv holdModEnv
decayModEnv sustainModEnv releaseModEnv keynumToModEnvHold
keynumToModEnvDecay delayVolEnv attackVolEnv holdVolEnv
decayVolEnv sustainVolEnv releaseVolEnv keynumToVolEnvHold
keynumToVolEnvDecay instrument reserved1 keyRange
velRange startloopAddrsCoarseOffset keynum velocity
initialAttenuation reserved2 endloopAddrsCoarseOffset coarseTune
fineTune sampleID sampleModes reserved3
scaleTuning exclusiveClass overridingRootKey unused5
endOper
);
%GenOpname2num = (); {
my $i=0; while ($i <= $#GeneratorOperators) {
$GenOpname2num{$GeneratorOperators[$i]} = $i;
$i += 1;
}
}
@GenAmountType = qw (
S s s s
s s s s
s s s s
s s x s
s s x x
x s s s
s s s s
s s s s
s s s s
s s s s
s S x C2
C2 s S S
S x s s
s S S x
s S s x
x
); # s signed, S unsigned, C2 two bytes, x null; sfspec21 8.1.2 & guesswork
$MODES_16BIT = 1; $MODES_UNSIGNED = 2;
$MODES_LOOPING = 4; $MODES_PINGPONG = 8;
$MODES_REVERSE = 16; $MODES_SUSTAIN = 32;
$MODES_ENVELOPE = 64; $MODES_CLAMPED = 128;
# sf:
# see http://www.pjb.com.au/midi.sfspec21.html#8.1.3
my %OnlyValidInInstr = map { $_, 1 } (0,1,2,3,4,12,45,50,54,57,58);
# gravis:
my $DefaultEnvelopeData = "\x3f\x46\x81\x42\x3f\x3f\xd5\xf2\xf6\x08\x08\x08";
# ----------------------- exportable functions -----------------------
sub file2bytes {
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.586 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )