cw 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +21 -0
  5. data/README.md +21 -0
  6. data/Rakefile +1 -0
  7. data/audio/audio_output.wav +0 -0
  8. data/audio/audio_output.wav0000.mp3 +0 -0
  9. data/audio/dash.wav +0 -0
  10. data/audio/dot.wav +0 -0
  11. data/audio/e_space.wav +0 -0
  12. data/audio/space.wav +0 -0
  13. data/cw.gemspec +18 -0
  14. data/daily.rb +182 -0
  15. data/data/text/abbreviations.txt +1 -0
  16. data/data/text/common_words.txt +90 -0
  17. data/data/text/cw_conversation.txt +1 -0
  18. data/data/text/most_common_words.txt +1 -0
  19. data/data/text/progress.txt +1 -0
  20. data/data/text/q_codes.txt +1 -0
  21. data/data/text/tom_sawyer.txt +6477 -0
  22. data/example.rb +139 -0
  23. data/lib/cw.rb +111 -0
  24. data/lib/cw/alphabet.rb +29 -0
  25. data/lib/cw/audio_player.rb +63 -0
  26. data/lib/cw/book.rb +239 -0
  27. data/lib/cw/book_details.rb +47 -0
  28. data/lib/cw/cl.rb +112 -0
  29. data/lib/cw/cw_dsl.rb +211 -0
  30. data/lib/cw/cw_encoding.rb +56 -0
  31. data/lib/cw/cw_params.rb +29 -0
  32. data/lib/cw/cw_threads.rb +36 -0
  33. data/lib/cw/file_details.rb +13 -0
  34. data/lib/cw/key_input.rb +53 -0
  35. data/lib/cw/monitor.rb +36 -0
  36. data/lib/cw/monitor_keys.rb +37 -0
  37. data/lib/cw/numbers.rb +29 -0
  38. data/lib/cw/print.rb +137 -0
  39. data/lib/cw/process.rb +11 -0
  40. data/lib/cw/progress.rb +27 -0
  41. data/lib/cw/randomize.rb +73 -0
  42. data/lib/cw/repeat_word.rb +91 -0
  43. data/lib/cw/rss.rb +71 -0
  44. data/lib/cw/sentence.rb +78 -0
  45. data/lib/cw/speak.rb +11 -0
  46. data/lib/cw/spoken.rb +11 -0
  47. data/lib/cw/str.rb +67 -0
  48. data/lib/cw/stream.rb +161 -0
  49. data/lib/cw/test_letters.rb +52 -0
  50. data/lib/cw/test_words.rb +59 -0
  51. data/lib/cw/tester.rb +221 -0
  52. data/lib/cw/timing.rb +92 -0
  53. data/lib/cw/tone_generator.rb +225 -0
  54. data/lib/cw/voice.rb +16 -0
  55. data/lib/cw/words.rb +182 -0
  56. data/read_book.rb +33 -0
  57. data/test/run_tests_continuously.rb +4 -0
  58. data/test/test_cw.rb +527 -0
  59. data/test/test_stream.rb +401 -0
  60. metadata +102 -0
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ class BookDetails
4
+
5
+ attr_reader :args
6
+
7
+ HERE = File.dirname(__FILE__) + '/'
8
+ BOOK_DIRECTORY = HERE + '../../data/text/'
9
+ BOOK_NAME = 'tom_sawyer.txt'
10
+
11
+ def initialize
12
+ @book_name = BOOK_NAME
13
+ @book_directory = BOOK_DIRECTORY
14
+ end
15
+
16
+ def book_location
17
+ @book_directory + @book_name
18
+ end
19
+
20
+ def arguments args
21
+ @args = args
22
+ @args[:output] = :letter unless @args[:output]
23
+ if @args[:duration]
24
+ @timeout = Time.now + @args[:duration] * 60.0
25
+ end
26
+ end
27
+
28
+ def session_finished? source
29
+ sentences_complete?(source) || book_timeout?
30
+ end
31
+
32
+ def sentences_complete? source
33
+ if @args.has_key?(:sentences) && @args[:sentences].is_a?(Fixnum)
34
+ if @sentence_count_source
35
+ @sentence_count_source = nil
36
+ else
37
+ @args[:sentences] -= 1
38
+ @sentence_count_source = true
39
+ end
40
+ true if(@args[:sentences] < 0)
41
+ end
42
+ end
43
+
44
+ def book_timeout?
45
+ @timeout && (Time.now > @timeout)
46
+ end
47
+ end
data/lib/cw/cl.rb ADDED
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ #class Cl performs command-line processing
4
+
5
+ class Cl
6
+
7
+ def initialize
8
+ @tone = {
9
+ sinewave: 0,
10
+ sawtooth: 1,
11
+ squarewave: 2
12
+ }
13
+ end
14
+
15
+ def cl_wpm
16
+ wpm = Params.wpm
17
+ wpm ? "-w #{wpm} " : ''
18
+ end
19
+
20
+ def cl_effective_wpm
21
+ ewpm = Params.effective_wpm
22
+ ewpm ? "-e #{ewpm} " : ''
23
+ end
24
+
25
+ def cl_word_spacing
26
+ ws = Params.word_spacing
27
+ ws ? "-W #{ws} " : ''
28
+ end
29
+
30
+ def cl_frequency
31
+ freq = Params.frequency
32
+ freq ? "-f #{freq} " : ''
33
+ end
34
+
35
+ def cl_squarewave
36
+ sqr = Params.tone == :squarewave
37
+ sqr ? "-T #{@tone[:squarewave]} " : ''
38
+ end
39
+
40
+ def cl_sawtooth
41
+ st = Params.tone == :sawtooth
42
+ st ? "-T #{@tone[:sawtooth]} " : ''
43
+ end
44
+
45
+ def cl_sinewave
46
+ sin = Params.tone == :sinewave
47
+ sin ? "-T #{@tone[:sinewave]} " : ''
48
+ end
49
+
50
+ def cl_author
51
+ author = Params.author
52
+ author ? "-a \"#{author}\" " : ''
53
+ end
54
+
55
+ def cl_title
56
+ title = Params.title
57
+ title ? "-t \"#{title}\" " : ''
58
+ end
59
+
60
+ def cl_noise
61
+ noise = Params.noise
62
+ noise ? "-N 5 -B 1000 " : ''
63
+ end
64
+
65
+ def cl_audio_filename
66
+ "-o \"#{Params.audio_dir}/#{Params.audio_filename}\" "
67
+ end
68
+
69
+ def coarse_quality(quality)
70
+ {
71
+ :high => "-q 1 ",
72
+ :medium => "-q 5 ",
73
+ :low => "-q 9 "
74
+ }[quality]
75
+ end
76
+
77
+ def cl_quality
78
+ quality = Params.quality
79
+ if quality && quality.class == Fixnum
80
+ "-q #{quality} "
81
+ else
82
+ coarse_quality quality
83
+ end
84
+ end
85
+
86
+ def cl_command_line
87
+ cl = Params.command_line
88
+ cl ? "#{cl}" : ''
89
+ end
90
+
91
+ def build_command_line
92
+ [ cl_wpm,
93
+ cl_effective_wpm,
94
+ cl_word_spacing,
95
+ cl_frequency,
96
+ cl_squarewave,
97
+ cl_sawtooth,
98
+ cl_sinewave,
99
+ cl_author,
100
+ cl_title,
101
+ cl_noise,
102
+ cl_audio_filename,
103
+ cl_quality,
104
+ cl_command_line
105
+ ].collect{|param| param}.join
106
+ end
107
+
108
+ def cl_echo words
109
+ "echo #{words} | ebook2cw #{build_command_line}"
110
+ end
111
+
112
+ end
data/lib/cw/cw_dsl.rb ADDED
@@ -0,0 +1,211 @@
1
+ # encoding: utf-8
2
+
3
+ # class Cw_dsl provides CW's commands
4
+
5
+ class CwDsl
6
+
7
+ HERE = File.dirname(__FILE__) + '/'
8
+ TEXT = HERE + '../../data/text/'
9
+ COMMON_WORDS = TEXT + 'common_words.txt'
10
+ MOST_COMMON_WORDS = TEXT + 'most_common_words.txt'
11
+ ABBREVIATIONS = TEXT + 'abbreviations.txt'
12
+ Q_CODES = TEXT + 'q_codes.txt'
13
+
14
+ def initialize
15
+ @words, @cl, @str =
16
+ Words.new, Cl.new, Str.new
17
+ init_config
18
+ end
19
+
20
+ [:name, :wpm,
21
+ :effective_wpm, :word_spacing,
22
+ :command_line, :frequency,
23
+ :author, :title,
24
+ :quality, :audio_filename,
25
+ :pause, :noise,
26
+ :shuffle, :mark_words,
27
+ :double_words, :single_words,
28
+ :audio_dir, :def_word_count
29
+ ].each do |method|
30
+ define_method method do |arg = nil|
31
+ arg ? Params.send("#{method}=", arg) : Params.send("#{method}")
32
+ end
33
+ end
34
+
35
+ [[:pause, :pause, true],
36
+ [:un_pause, :pause, nil],
37
+ [:print_letters, :print_letters, true],
38
+ [:mark_words, :print_letters, nil],
39
+ [:noise, :noise, true],
40
+ [:no_noise, :noise, nil],
41
+ [:shuffle, :shuffle, true],
42
+ [:no_shuffle, :shuffle, nil],
43
+ [:double_words, :double_words, true],
44
+ [:single_words, :double_words, nil],
45
+ [:use_ebook2cw, :use_ebook2cw, true],
46
+ [:use_ruby_tone, :use_ebook2cw, nil],
47
+ ].each do |bool|
48
+ define_method bool[0] do
49
+ Params.send("#{bool[1]}=", bool[2])
50
+ @words.shuffle if((bool[1] == :shuffle) && (bool[2]))
51
+ end
52
+ end
53
+
54
+ def init_config
55
+ Params.config do
56
+ param :name, :wpm,
57
+ :dictionary, :command_line, :audio_filename, :tone, :pause,
58
+ :print_letters, :double_words,
59
+ :word_filename, :author, :title, :quality, :frequency, :shuffle, :effective_wpm,
60
+ :max, :min, :word_spacing, :noise, :begin, :end, :word_count, :including,
61
+ :word_size, :size, :beginning_with, :ending_with, :mark_words, :audio_dir,
62
+ :use_ebook2cw, :def_word_count
63
+ end
64
+
65
+ config_defaults
66
+ config_files
67
+ end
68
+
69
+ def config_defaults
70
+ Params.config {
71
+ name 'unnamed'
72
+ wpm 25
73
+ frequency 500
74
+ dictionary COMMON_WORDS
75
+ # def_word_count 100
76
+ }
77
+ end
78
+
79
+ def config_files
80
+ Params.config {
81
+ audio_dir 'audio'
82
+ audio_filename 'audio_output.wav'
83
+ word_filename 'words.txt'
84
+ }
85
+ end
86
+
87
+ def words
88
+ @words.all
89
+ end
90
+
91
+ def words= words
92
+ @words.add words
93
+ end
94
+
95
+ def word_size(size = nil)
96
+ if size
97
+ Params.size = size
98
+ @words.word_size size
99
+ end
100
+ Params.size
101
+ end
102
+
103
+ def beginning_with(* letters)
104
+ @words.beginning_with letters
105
+ Params.begin = letters
106
+ end
107
+
108
+ def ending_with(* letters)
109
+ @words.ending_with letters
110
+ Params.end = letters
111
+ end
112
+
113
+ def word_count(wordcount)
114
+ Params.word_count = wordcount
115
+ @words.count wordcount
116
+ end
117
+
118
+ def including(* letters)
119
+ Params.including = letters
120
+ @words.including letters
121
+ end
122
+
123
+ def no_longer_than(max)
124
+ Params.max = max
125
+ @words.no_longer_than max
126
+ end
127
+
128
+ def no_shorter_than(min)
129
+ Params.min = min
130
+ @words.no_shorter_than min
131
+ end
132
+
133
+ def reverse
134
+ @words.reverse
135
+ end
136
+
137
+ def letters_numbers
138
+ @words.letters_numbers
139
+ end
140
+
141
+ def random_letters_numbers(options = {})
142
+ options.merge!(letters_numbers: true)
143
+ @words.random_letters_numbers options
144
+ end
145
+
146
+ def random_letters(options = {})
147
+ @words.random_letters(options)
148
+ end
149
+
150
+ def random_numbers(options = {})
151
+ @words.random_numbers(options)
152
+ end
153
+
154
+ def alphabet(options = {reverse: nil})
155
+ @words.alphabet(options)
156
+ end
157
+
158
+ def numbers(options = {reverse: nil})
159
+ @words.numbers(options)
160
+ end
161
+
162
+ def numbers_spoken()
163
+ end
164
+
165
+ # def add_noise
166
+ # Params.noise = true
167
+ # end
168
+
169
+ def reload
170
+ load_words(Params.dictionary)
171
+ end
172
+
173
+ def load_common_words
174
+ load_words
175
+ end
176
+
177
+ def load_most_common_words
178
+ load_words MOST_COMMON_WORDS
179
+ end
180
+
181
+ def load_abbreviations
182
+ load_words ABBREVIATIONS
183
+ end
184
+
185
+ def load_q_codes
186
+ load_words Q_CODES
187
+ end
188
+
189
+ #todo refactor
190
+
191
+ def load_alphabet
192
+ @words.assign 'a b c d e f g h i j k l m n o p q r s t u v w x y z '
193
+ end
194
+
195
+ def load_numbers
196
+ @words.assign '1 2 3 4 5 6 7 8 9 0 '
197
+ end
198
+
199
+ def load_words(filename = COMMON_WORDS)
200
+ Params.dictionary = filename
201
+ @words.load filename
202
+ end
203
+
204
+ def set_tone_type(type)
205
+ case type
206
+ when :squarewave, :sawtooth, :sinewave
207
+ Params.tone = type
208
+ end
209
+ end
210
+
211
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ class CwEncoding
4
+
5
+ def fetch char
6
+ encode[char]
7
+ end
8
+
9
+ def encode
10
+ {
11
+ 'a' => [:dot, :dash],
12
+ 'b' => [:dash, :dot, :dot, :dot],
13
+ 'c' => [:dash, :dot, :dash, :dot],
14
+ 'd' => [:dash, :dot, :dot],
15
+ 'e' => [:dot],
16
+ 'f' => [:dot, :dot, :dash, :dot],
17
+ 'g' => [:dash, :dash, :dot],
18
+ 'h' => [:dot, :dot, :dot, :dot],
19
+ 'i' => [:dot, :dot],
20
+ 'j' => [:dot, :dash, :dash, :dash],
21
+ 'k' => [:dash, :dot, :dash],
22
+ 'l' => [:dot, :dash, :dot, :dot],
23
+ 'm' => [:dash, :dash],
24
+ 'n' => [:dash, :dot],
25
+ 'o' => [:dash, :dash, :dash],
26
+ 'p' => [:dot, :dash, :dash, :dot],
27
+ 'q' => [:dash, :dash, :dot, :dash],
28
+ 'r' => [:dot, :dash, :dot],
29
+ 's' => [:dot, :dot, :dot],
30
+ 't' => [:dash],
31
+ 'u' => [:dot, :dot, :dash],
32
+ 'v' => [:dot, :dot, :dot, :dash],
33
+ 'w' => [:dot, :dash, :dash],
34
+ 'x' => [:dash, :dot, :dot, :dash],
35
+ 'y' => [:dash, :dot, :dash, :dash],
36
+ 'z' => [:dash, :dash, :dot, :dot],
37
+ '1' => [:dot, :dash, :dash, :dash, :dash],
38
+ '2' => [:dot, :dot, :dash, :dash, :dash],
39
+ '3' => [:dot, :dot, :dot, :dash, :dash],
40
+ '4' => [:dot, :dot, :dot, :dot, :dash],
41
+ '5' => [:dot, :dot, :dot, :dot, :dot],
42
+ '6' => [:dash, :dot, :dot, :dot, :dot],
43
+ '7' => [:dash, :dash, :dot, :dot, :dot],
44
+ '8' => [:dash, :dash, :dash, :dot, :dot],
45
+ '9' => [:dash, :dash, :dash, :dash, :dot],
46
+ '0' => [:dash, :dash, :dash, :dash, :dash],
47
+ '.' => [:dot, :dash, :dot, :dash, :dot, :dash],
48
+ ',' => [:dash, :dash, :dot, :dot, :dash, :dash],
49
+ '=' => [:dash, :dot, :dot,:dot, :dash],
50
+ '!' => [:dot, :dot, :dash, :dash, :dot],
51
+ '/' => [:dash, :dot, :dot, :dash, :dot],
52
+ '?' => [:dot, :dot, :dash, :dash, :dot, :dot],
53
+ ' ' => []
54
+ }
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Params
4
+
5
+ extend self
6
+
7
+ def param_method values, name
8
+ value = values.first
9
+ value ? self.send("#{name}=", value) : instance_variable_get("@#{name}")
10
+ end
11
+
12
+ def param_internal name
13
+ attr_accessor name
14
+ instance_variable_set("@#{name}", nil)
15
+ define_method name do | * values|
16
+ param_method values, name
17
+ end
18
+ end
19
+
20
+ def param( * names)
21
+ names.each do |name|
22
+ param_internal name
23
+ end
24
+ end
25
+
26
+ def config( & block)
27
+ instance_eval( & block)
28
+ end
29
+ end