]> gitweb.factorcode.org Git - factor.git/blob - extra/morse/morse.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / extra / morse / morse.factor
1 ! Copyright (C) 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators hashtables kernel lists math namespaces openal parser-combinators promises sequences strings symbols synth synth.buffers unicode.case ;
4 IN: morse
5
6 <PRIVATE
7 : morse-codes ( -- array )
8     {
9         { CHAR: a ".-"    }
10         { CHAR: b "-..."  }
11         { CHAR: c "-.-."  }
12         { CHAR: d "-.."   }
13         { CHAR: e "."     }
14         { CHAR: f "..-."  }
15         { CHAR: g "--."   }
16         { CHAR: h "...."  }
17         { CHAR: i ".."    }
18         { CHAR: j ".---"  }
19         { CHAR: k "-.-"   }
20         { CHAR: l ".-.."  }
21         { CHAR: m "--"    }
22         { CHAR: n "-."    }
23         { CHAR: o "---"   }
24         { CHAR: p ".--."  }
25         { CHAR: q "--.-"  }
26         { CHAR: r ".-."   }
27         { CHAR: s "..."   }
28         { CHAR: t "-"     }
29         { CHAR: u "..-"   }
30         { CHAR: v "...-"  }
31         { CHAR: w ".--"   }
32         { CHAR: x "-..-"  }
33         { CHAR: y "-.--"  }
34         { CHAR: z "--.."  }
35         { CHAR: 1 ".----" }
36         { CHAR: 2 "..---" }
37         { CHAR: 3 "...--" }
38         { CHAR: 4 "....-" }
39         { CHAR: 5 "....." }
40         { CHAR: 6 "-...." }
41         { CHAR: 7 "--..." }
42         { CHAR: 8 "---.." }
43         { CHAR: 9 "----." }
44         { CHAR: 0 "-----" }
45         { CHAR: . ".-.-.-" }
46         { CHAR: , "--..--" }
47         { CHAR: ? "..--.." }
48         { CHAR: ' ".----." }
49         { CHAR: ! "-.-.--" }
50         { CHAR: / "-..-."  }
51         { CHAR: ( "-.--."  }
52         { CHAR: ) "-.--.-" }
53         { CHAR: & ".-..."  }
54         { CHAR: : "---..." }
55         { CHAR: ; "-.-.-." }
56         { CHAR: = "-...- " }
57         { CHAR: + ".-.-."  }
58         { CHAR: - "-....-" }
59         { CHAR: _ "..--.-" }
60         { CHAR: " ".-..-." }
61         { CHAR: $ "...-..-" }
62         { CHAR: @ ".--.-." }
63         { CHAR: \s "/" }
64     } ;
65
66 : ch>morse-assoc ( -- assoc )
67     morse-codes >hashtable ;
68
69 : morse>ch-assoc ( -- assoc )
70     morse-codes [ reverse ] map >hashtable ;
71
72 PRIVATE>
73
74 : ch>morse ( ch -- str )
75     ch>lower ch>morse-assoc at* swap "" ? ;
76
77 : morse>ch ( str -- ch )
78     morse>ch-assoc at* swap f ? ;
79
80 : >morse ( str -- str )
81     [
82         [ CHAR: \s , ] [ ch>morse % ] interleave
83     ] "" make ;
84
85 <PRIVATE
86
87 : dot-char ( -- ch ) CHAR: . ;
88 : dash-char ( -- ch ) CHAR: - ;
89 : char-gap-char ( -- ch ) CHAR: \s ;
90 : word-gap-char ( -- ch ) CHAR: / ;
91
92 : =parser ( obj -- parser )
93     [ = ] curry satisfy ;
94
95 LAZY: 'dot' ( -- parser )
96     dot-char =parser ;
97
98 LAZY: 'dash' ( -- parser )
99     dash-char =parser ;
100
101 LAZY: 'char-gap' ( -- parser )
102     char-gap-char =parser ;
103
104 LAZY: 'word-gap' ( -- parser )
105     word-gap-char =parser ;
106
107 LAZY: 'morse-char' ( -- parser )
108     'dot' 'dash' <|> <+> ;
109
110 LAZY: 'morse-word' ( -- parser )
111     'morse-char' 'char-gap' list-of ;
112
113 LAZY: 'morse-words' ( -- parser )
114     'morse-word' 'word-gap' list-of ;
115
116 PRIVATE>
117
118 : morse> ( str -- str )
119     'morse-words' parse car parsed>> [
120         [ 
121             >string morse>ch
122         ] map >string
123     ] map [ [ CHAR: \s , ] [ % ] interleave ] "" make ;
124
125 <PRIVATE
126 SYMBOLS: source dot-buffer dash-buffer intra-char-gap-buffer letter-gap-buffer ;
127
128 : queue ( symbol -- )
129     get source get swap queue-buffer ;
130
131 : dot ( -- ) dot-buffer queue ;
132 : dash ( -- ) dash-buffer queue ;
133 : intra-char-gap ( -- ) intra-char-gap-buffer queue ;
134 : letter-gap ( -- ) letter-gap-buffer queue ;
135
136 : beep-freq 880 ;
137
138 : <morse-buffer> ( -- buffer )
139     half-sample-freq <8bit-mono-buffer> ;
140
141 : sine-buffer ( seconds -- id )
142     beep-freq swap <morse-buffer> >sine-wave-buffer
143     send-buffer id>> ;
144
145 : silent-buffer ( seconds -- id )
146     <morse-buffer> >silent-buffer send-buffer id>> ;
147
148 : make-buffers ( unit-length -- )
149     {
150         [ sine-buffer dot-buffer set ]
151         [ 3 * sine-buffer dash-buffer set ]
152         [ silent-buffer intra-char-gap-buffer set ]
153         [ 3 * silent-buffer letter-gap-buffer set ]
154     } cleave ;
155
156 : playing-morse ( quot unit-length -- )
157     [
158         init-openal 1 gen-sources first source set make-buffers
159         call
160         source get source-play
161     ] with-scope ;
162
163 : play-char ( ch -- )
164     [ intra-char-gap ] [
165         {
166             { dot-char [ dot ] }
167             { dash-char [ dash ] }
168             { word-gap-char [ intra-char-gap ] }
169         } case
170     ] interleave ;
171
172 PRIVATE>
173
174 : play-as-morse* ( str unit-length -- )
175     [
176         [ letter-gap ] [ ch>morse play-char ] interleave
177     ] swap playing-morse ;
178
179 : play-as-morse ( str -- )
180     0.05 play-as-morse* ;