Jump to content

Metronome: Difference between revisions

268 bytes removed ,  10 years ago
(Add factor)
Line 154:
=={{header|Factor}}==
<lang factor>USING: accessors calendar circular colors.constants colors.hsv
concurrency.semaphores continuations formattingkernel frymath openal.example
threads timers ui ui.gadgets ui.gadgets.worlds ui.pens.solid ;
generalizations io.launcher kernel math sequences threads timers
ui ui.gadgets ui.gadgets.worlds ui.pens.solid ;
IN: rosetta-code.metronome
 
! linux alsa..
! For debian, in package alsa-utils
: <wave-process> ( freq -- process ) "speaker-test -t sine -f %d -p 20000" sprintf ;
: bpm>duration ( bpm -- duration ) 60 swap / seconds ;
 
: blink-gadget ( gadget freq -- ) 1.0 1.0 1.0 <hsva> <solid> >>interior relayout-1 ;
: blank-gadget ( gadget --1.0 )1.0 COLOR:1.0 <hsva> white <solid> >>interior relayout-1 ;
 
: blank-gadget ( gadget -- )
COLOR: white <solid> >>interior relayout-1 ;
 
: play-note ( gadget freq -- )
[ dupd [ blink-gadget ] [ <wave0.3 play-process>sine runblank-detachedgadget ] bi2bi ;
[ [ kill-process blank-gadget ] 2curry 300 milliseconds later drop ]
[ [ wait-for-process ] ignore-errors drop ] bi ;
 
: circular-while* ( ... circular quot: ( ... el -- ... ? ) -- ... )
[ clone ] dip '[ [ first @ ] [ rotate-circular ] bi ] curry loop ; inline
: open-metronome-window ( -- gadget )
gadget new { 200 200 } >>pref-dim
{ 200 200 } >>pref-dim dup "Metronome" open-window yield ;
 
: metronome-loop ( gadget notes semaphore -- )
{[
[ acquire [ play-note ] [ drop find-world handle>> ] 2bi ] curry with circular-while* ;
: start-metronome-timer ( bpm semaphore -- timer ) [ release ] curry swap bpm>duration every ;
] curry with circular-loop ;
 
: (start-metronome-timer) ( bpm semaphore -- timer ) [ release ] curry swap bpm>duration every ;
[ release ] curry swap bpm>duration every ;
 
: start-metronome-timer ( bpm -- timer semaphore )
0 <semaphore> [ 2nip (start-metronome-timer) ] keep ;
 
: run-metronome ( semaphore notes -- )
[ open-metronome-window ] 2dip <circular> swap metronome-loop ;
 
: metronome ( bpm notes -- )
<circular> open [ start-metronome-windowtimer ] dip
[ run-metronome ] 2curry [ stop-timer ] [ ] cleanup ;
[ swap
 
0 <semaphore>
!: metronome-example usage:( -- ) 60 { 440 220 330 } metronome</lang> ;
{
 
[ 2nip start-metronome-timer ]
[MAIN: metronome-loop drop ]example</lang>
} 4 ncleave
]
[ close-window stop-timer ] bi ;
! example usage: 60 { 440 220 330 } metronome</lang>
 
=={{header|Haskell}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.