! Copyright (C) 2007, 2008 Alex Chapman ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs combinators hashtables kernel lists math namespaces make openal parser-combinators promises sequences strings symbols synth synth.buffers unicode.case ; IN: morse morse-assoc ( -- assoc ) morse-codes >hashtable ; : morse>ch-assoc ( -- assoc ) morse-codes [ reverse ] map >hashtable ; PRIVATE> : ch>morse ( ch -- str ) ch>lower ch>morse-assoc at* swap "" ? ; : morse>ch ( str -- ch ) morse>ch-assoc at* swap f ? ; : >morse ( str -- str ) [ [ CHAR: \s , ] [ ch>morse % ] interleave ] "" make ; <+> ; LAZY: 'morse-word' ( -- parser ) 'morse-char' 'char-gap' list-of ; LAZY: 'morse-words' ( -- parser ) 'morse-word' 'word-gap' list-of ; PRIVATE> : morse> ( str -- str ) 'morse-words' parse car parsed>> [ [ >string morse>ch ] map >string ] map [ [ CHAR: \s , ] [ % ] interleave ] "" make ; ( -- buffer ) half-sample-freq <8bit-mono-buffer> ; : sine-buffer ( seconds -- id ) beep-freq swap >sine-wave-buffer send-buffer id>> ; : silent-buffer ( seconds -- id ) >silent-buffer send-buffer id>> ; : make-buffers ( unit-length -- ) { [ sine-buffer dot-buffer set ] [ 3 * sine-buffer dash-buffer set ] [ silent-buffer intra-char-gap-buffer set ] [ 3 * silent-buffer letter-gap-buffer set ] } cleave ; : playing-morse ( quot unit-length -- ) [ init-openal 1 gen-sources first source set make-buffers call source get source-play ] with-scope ; : play-char ( ch -- ) [ intra-char-gap ] [ { { dot-char [ dot ] } { dash-char [ dash ] } { word-gap-char [ intra-char-gap ] } } case ] interleave ; PRIVATE> : play-as-morse* ( str unit-length -- ) [ [ letter-gap ] [ ch>morse play-char ] interleave ] swap playing-morse ; : play-as-morse ( str -- ) 0.05 play-as-morse* ;