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