rosetta-code.metronome: adding metronome solution.
							parent
							
								
									410a71f677
								
							
						
					
					
						commit
						0948479743
					
				| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
! Copyright (C) 2013 Jon Harper.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
 | 
			
		||||
USING: accessors calendar circular colors.constants colors.hsv
 | 
			
		||||
concurrency.semaphores continuations formatting fry
 | 
			
		||||
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 -- )
 | 
			
		||||
    COLOR: white <solid> >>interior relayout-1 ;
 | 
			
		||||
 | 
			
		||||
: play-note ( gadget freq -- )
 | 
			
		||||
    [ dupd blink-gadget ] [ <wave-process> run-detached ] bi
 | 
			
		||||
    [ [ kill-process blank-gadget ] 2curry 300 milliseconds later drop ]
 | 
			
		||||
    [ [ wait-for-process ] ignore-errors drop ] bi ;
 | 
			
		||||
 | 
			
		||||
: open-metronome-window ( -- gadget )
 | 
			
		||||
    gadget new { 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-loop ;
 | 
			
		||||
 | 
			
		||||
: start-metronome-timer ( bpm semaphore -- timer )
 | 
			
		||||
    [ release ] curry swap bpm>duration every ;
 | 
			
		||||
 | 
			
		||||
: metronome ( bpm notes -- )
 | 
			
		||||
    <circular> open-metronome-window
 | 
			
		||||
    [
 | 
			
		||||
        swap 0 <semaphore>
 | 
			
		||||
        {
 | 
			
		||||
            [ 2nip start-metronome-timer ]
 | 
			
		||||
            [ metronome-loop drop ]
 | 
			
		||||
        } 4 ncleave
 | 
			
		||||
    ]
 | 
			
		||||
    [ close-window stop-timer ] bi ;
 | 
			
		||||
 | 
			
		||||
! example usage: 60 { 440 220 330 } metronome
 | 
			
		||||
		Loading…
	
		Reference in New Issue