package DensePad; #DensePad.pm - Sound Object for Computer Music #Copyright (C) 2001 Jacob T. Joaquin # #This program is free software; you can redistribute it and/or #modify it under the terms of the GNU General Public License #as published by the Free Software Foundation; either version 2 #of the License, or (at your option) any later version. # #This program is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU General Public License #along with this program; if not, write to the Free Software #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use strict; # Constructor sub new { my $self = {}; $self->{INSTR} = 1; $self->{DURATION} = 1; $self->{AMP} = 1; $self->{AMPSLOPE} = 1; $self->{FREQ} = 440; $self->{PAN} = 0.5; $self->{VOICE} = 1; $self->{HARMMIN} = 1; $self->{HARMMAX} = 2; $self->{HARMBEND} = 1; bless($self); return $self; } # Methods sub instr { my $self = shift; if (@_) { $self->{INSTR} = shift } return $self->{INSTR}; } sub duration { my $self = shift; if (@_) { $self->{DURATION} = shift } return $self->{DURATION}; } sub amp { my $self = shift; if (@_) { $self->{AMP} = shift } return $self->{AMP}; } sub ampslope { my $self = shift; if (@_) { $self->{AMPSLOPE} = shift } return $self->{AMPSLOPE}; } sub freq { my $self = shift; if (@_) { $self->{FREQ} = shift } return $self->{FREQ}; } sub pan { my $self = shift; if (@_) { $self->{PAN} = shift } return $self->{PAN}; } sub voice { my $self = shift; if (@_) { $self->{voice} = shift } return $self->{voice}; } sub harmmin { my $self = shift; if (@_) { $self->{HARMMIN} = shift } return $self->{HARMMIN}; } sub harmmax { my $self = shift; if (@_) { $self->{HARMMAX} = shift } return $self->{HARMMAX}; } sub harmbend { my $self = shift; if (@_) { $self->{HARMBEND} = shift } return $self->{HARMBEND}; } sub harmonic { my $self = shift; my ( $freq, $h, $dest, $bend ) = @_; if ($h == 0) { $h = 1; } if ($dest == 0) { $dest = 1; } return $freq * int(rand($dest) + 1) / int(rand($h) + 1) * $bend; } sub punch { my $self = shift; my $p1 = $self->{INSTR}; my $p2 = $_[0]; # start my $p3 = $self->{DURATION}; my $p4 = $self->{AMP}; my $p5 = $self->{FREQ}; my $p6 = $self->{PAN}; my $numOfVoice = $self->voice; my $i = 0; my $theReturn = ""; my $thisFreq = $p5; my @list; for ($i = 0; $i < $numOfVoice; $i++) { if ($thisFreq > 22050 || $thisFreq < 20 ) { last; } push(@list, $thisFreq); $thisFreq = $self->harmonic( $thisFreq, $self->{HARMMIN}, $self->{HARMMAX}, $self->{HARMBEND} ); } @list = sort { $a <=> $b } @list; # sort frequency list # format $theReturn foreach(@list){ $theReturn = $theReturn.(sprintf "i%d %.8g %.8g %.8f %.8g %.4g\n", $p1, $p2, $p3, $p4, $_, $p6); $p4 *= $self->{AMPSLOPE}; } return $theReturn; } 1;