Archive for the ‘audio’ Category

Bassline Synth sourcecode now online

Tuesday, March 31st, 2009

I just released the source code for the simple synthesizer, for those who are interested.

A simple synthesizer in 7.17 Kb of Flash

Thursday, March 19th, 2009

Flash finally raised my curiousity by adding fully programmable audio in Flash player 10. This means you can read the currently playing audio stream to provide reasonably accurate VU meters etc, but more interesting, it means you can write your own audio-generating algorithms.

To test if flash is actually fast enough and to see if it’s really possible to write flash apps using nothing but the free mxmlc compiler and emacs, I wrote a simple synthesizer in flash 10. The result is fairly pleasing.

Bassline screenshot
Check it out!

perl audio modules get reviewed

Thursday, December 13th, 2007

Jonathan Stowe wrote a short piece on a demo he gave on making music with perl and includes code and mp3. He’s been using my Audio::SndFile and Audio::LADSPA modules and was kind enough to also write some positive reviews on them.

Audio::LADSPA review, Audio::SndFile review.

Lisp, functies, macros en expressieve code

Tuesday, October 30th, 2007

Ik ben jaren geleden al eens begonnen aan een Perl module om (onder andere) modulaire synthesizers te emuleren. En dat werkte wel, maar mooi was het niet:

Maak wat processors….

    my $net = Audio::LADSPA::Network->new();
    my $sine = $net->add_plugin( label => 'sine_fcac' );
    my $delay = $net->add_plugin( label => 'delay_5s' );
    my $play = $net->add_plugin('Audio::LADSPA::Plugin::Play');

verbind ze met mekaar en zet parameters…

    $net->connect($sine,'Output',$delay,'Input');
    $net->connect($delay,'Output',$play,'Input');
    
    $sine->set('Frequency (Hz)' => 440); # set freq
    $sine->set(Amplitude => 1);   # set amp

    $delay->set('Delay (Seconds)' => 1); # 1 sec delay
    $delay->set('Dry/Wet Balance' => 0.2); # balance - 0.2

en draaien maar!

    for ( 0 .. 100 ) {
        $net->run(100);
    }

Allemaal leuk, maar veel te veel typ werk en behoorlijk complex.

Op vakantie heb ik laatst Practical Common Lisp doorgelezen en dan ga je natuurlijk denken dat dat beter kan als je functies gebruikt ipv complexe objecten en dat het er in Lisp veel beter uit kan zien.

Dat is dus ook zo :-)

; ik ga hier processors gebruiken
(with-processors
    ; maak een paar processors
    ((sine (sine-processor))   
     (delay (delay-processor))
     (m (stream-mixer))
     (mlt (stream-mult)))
  (with-audio-stream stream 0 1 ()  ; gebruik 1 audio output
    (dotimes (i 400)
      (write-audio stream
		   (<- m         ; output van m
		       :input-1 (<- sine :frequency 0.1)
		       :factor-1 0.2   ; specificeer vaste parameter
		       :input-2 (<- ^sine)  ; uitvoer van sine processor hierboven
		       :factor-2 0.0)))))

Ik gebruik

(<- ... )

als een macro die de juiste output van een processor selecteerd:
:output bij default, anders scrijf je

(<- :andere-output processor .... )

En definieren van een processor is ook erg versimpeld:

(defprocessor mult-processor
    ((output :stream)) 
    ((input :stream) (factor :scalar))
    ()
  (dotimes (i *num-frames*)
    (setf (aref output i) (* (aref input i) factor))))