morse-code-rb 0.3.1 → 0.4.0
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.
- checksums.yaml +4 -4
- data/README.md +45 -18
- data/lib/morse_code.rb +2 -0
- data/lib/morse_code/cli.rb +8 -2
- data/lib/morse_code/encoder.rb +6 -2
- data/lib/morse_code/sample.rb +56 -0
- data/lib/morse_code/version.rb +1 -1
- data/lib/morse_code/wave.rb +37 -0
- metadata +47 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d462b9a026bf1b78899a3658c9f1aea1724c55e3a667885411643e7d5cf87bba
|
4
|
+
data.tar.gz: 863ca3cca3e2aeafabbd8af2dbc38e5a3d789c43a6d4a792992d7de803fbcd79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fea1e42aeae37195b47e1ad0a4230b17711d93ba92ca57177e6c17b9c10c1e9ed6f5b851f0c89ed49eb266363c1672b6a1dcd2da1c21717189014494e98481c0
|
7
|
+
data.tar.gz: ca1ab83f9bc9ede971db2c47712f5765517aa6b02569c5880cd70872f74782de64229c56c1f57d44e21f55e550e4e8dfea286958d3d99f99716b2db73951105e
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Simple Morse Code Encode and Decode Tool
|
4
4
|
|
5
|
-
[](https://rubygems.org/gems/morse-code-rb) [](https://travis-ci.org/superiorlu/morse_code) [](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [](https://github.com/superiorlu/morse_code/blob/master/LICENSE.md)
|
5
|
+
[](https://rubygems.org/gems/morse-code-rb) [](https://travis-ci.org/superiorlu/morse_code) [](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [](https://codeclimate.com/github/superiorlu/morse_code/test_coverage) [](https://github.com/superiorlu/morse_code/blob/master/LICENSE.md)
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -29,19 +29,30 @@ require 'morse_code'
|
|
29
29
|
|
30
30
|
content = 'I am Robot.'
|
31
31
|
MorseCode::Encoder.new(content).encode
|
32
|
-
|
32
|
+
=> ".. / .- -- / .-. --- -... --- - .-.-.-"
|
33
33
|
|
34
34
|
MorseCode::Encoder.new(content).dit_dah
|
35
|
-
|
35
|
+
=> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
|
36
36
|
|
37
|
-
content = '我是中国人'
|
37
|
+
content = 'I am Chinese 我是中国人'
|
38
38
|
MorseCode::Encoder.new(content).encode
|
39
|
-
|
39
|
+
=> ".. / .- -- / -.-. .... .. -. . ... . / --...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-."
|
40
40
|
|
41
41
|
MorseCode::Encoder.new(content).dit_dah
|
42
|
-
|
42
|
+
=> "DITDIT / DITDAH DAHDAH / DAHDITDAHDIT DITDITDITDIT DITDIT DAHDIT DIT DITDITDIT DIT / DAHDAHDITDITDITDAHDITDITDITDITDAHDITDITDITDAH DAHDAHDITDITDAHDAHDITDITDITDAHDITDAHDAHDAHDAH DAHDITDITDAHDAHDAHDITDITDITDAHDITDAHDAHDITDAH DAHDITDAHDITDAHDAHDITDAHDAHDAHDAHDAHDAHDITDAH DAHDITDITDAHDAHDAHDITDAHDITDAHDAHDAHDITDAHDIT"
|
43
43
|
```
|
44
44
|
|
45
|
+
#### Generate Wave File
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
require 'morse_code'
|
49
|
+
|
50
|
+
content = 'I am Robot.'
|
51
|
+
MorseCode::Encoder.new(content).wave
|
52
|
+
=> "/tmp/morse_code-5b9b3aa176.wav"
|
53
|
+
```
|
54
|
+
you can open this wave file and listen to the morse code sound.
|
55
|
+
|
45
56
|
### Decode
|
46
57
|
|
47
58
|
```ruby
|
@@ -49,15 +60,15 @@ require 'morse_code'
|
|
49
60
|
|
50
61
|
content = '.. / .- -- / .-. --- -... --- - .-.-.-'
|
51
62
|
MorseCode::Decoder.new(content).decode
|
52
|
-
|
63
|
+
=> "I AM ROBOT."
|
53
64
|
|
54
65
|
dit_dah = 'DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH'
|
55
66
|
MorseCode::Decoder.new(dit_dah).dit_dah_to
|
56
|
-
|
67
|
+
=> "I AM ROBOT."
|
57
68
|
|
58
|
-
content = '--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
|
69
|
+
content = '.. / .- -- / -.-. .... .. -. . ... . / --...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
|
59
70
|
MorseCode::Decoder.new(content).decode
|
60
|
-
|
71
|
+
=> "I AM CHINESE 我是中国人"
|
61
72
|
```
|
62
73
|
|
63
74
|
### Terminal
|
@@ -72,28 +83,44 @@ mc commands:
|
|
72
83
|
|
73
84
|
#### encode
|
74
85
|
|
86
|
+
```shell
|
87
|
+
$> mc help encode
|
88
|
+
Usage:
|
89
|
+
mc encode MESSAGE
|
90
|
+
|
91
|
+
Options:
|
92
|
+
-d, [--dit-dah], [--no-dit-dah] # encode DITDAH message
|
93
|
+
-w, [--wave], [--no-wave] # gen morse code wav
|
94
|
+
|
95
|
+
encode message as Morse Code
|
96
|
+
```
|
97
|
+
|
75
98
|
```shell
|
76
99
|
$> mc -e 'I am Robot.'
|
77
|
-
|
100
|
+
=> ".. / .- -- / .-. --- -... --- - .-.-.-"
|
78
101
|
|
79
102
|
$> mc -e 'I am Robot.' --dit-dah
|
80
|
-
|
103
|
+
=> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
|
104
|
+
|
105
|
+
$> mc -e 'I am Chinese 我是中国人'
|
106
|
+
$> ".. / .- -- / -.-. .... .. -. . ... . / --...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-."
|
81
107
|
|
82
|
-
$> mc -e '我是中国人'
|
83
|
-
|
108
|
+
$> mc -e -w 'I am Chinese 我是中国人'
|
109
|
+
=> ".. / .- -- / -.-. .... .. -. . ... . / --...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-."
|
110
|
+
=> "Generate wave file: /tmp/morse_code-0d56cd233e.wav" # open and listen to the morse code sound
|
84
111
|
```
|
85
112
|
|
86
113
|
#### decode
|
87
114
|
|
88
115
|
```shell
|
89
116
|
$> mc -d '.. / .- -- / .-. --- -... --- - .-.-.-'
|
90
|
-
|
117
|
+
=> "I AM ROBOT."
|
91
118
|
|
92
119
|
$> mc -d 'DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH' --dit-dah
|
93
|
-
|
120
|
+
=> "I AM ROBOT."
|
94
121
|
|
95
|
-
$> mc -d '--...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
|
96
|
-
|
122
|
+
$> mc -d '.. / .- -- / -.-. .... .. -. . ... . / --...-....-...- --..--...-.---- -..---...-.--.- -.-.--.------.- -..---.-.---.-.'
|
123
|
+
=> "I AM CHINESE 我是中国人"
|
97
124
|
```
|
98
125
|
|
99
126
|
### Contributing
|
data/lib/morse_code.rb
CHANGED
data/lib/morse_code/cli.rb
CHANGED
@@ -10,11 +10,17 @@ module MorseCode
|
|
10
10
|
|
11
11
|
desc 'encode MESSAGE', 'encode message as Morse Code'
|
12
12
|
method_option :dit_dah, aliases: '-d', type: :boolean, desc: 'encode DITDAH message'
|
13
|
+
method_option :wave, aliases: '-w', type: :boolean, desc: 'gen morse code wav'
|
13
14
|
def encode(message = '')
|
15
|
+
encoder = MorseCode::Encoder.new(message)
|
14
16
|
if options[:dit_dah]
|
15
|
-
puts
|
17
|
+
puts encoder.dit_dah
|
16
18
|
else
|
17
|
-
puts
|
19
|
+
puts encoder.encode
|
20
|
+
end
|
21
|
+
if options[:wave]
|
22
|
+
wavefile = encoder.wave
|
23
|
+
puts "Generate wave file: #{wavefile}"
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
data/lib/morse_code/encoder.rb
CHANGED
@@ -12,7 +12,7 @@ module MorseCode
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def encode
|
15
|
-
[].tap do |encode_words|
|
15
|
+
@encode ||= [].tap do |encode_words|
|
16
16
|
@message.split(/\s+/).each do |word|
|
17
17
|
encode_words.concat(encode_word(word))
|
18
18
|
end
|
@@ -21,10 +21,14 @@ module MorseCode
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def encode_with
|
24
|
-
encode.tap { |message| message.gsub!('.', 'DIT')
|
24
|
+
encode.dup.tap { |message| message.gsub!('.', 'DIT').gsub!('-', 'DAH') }
|
25
25
|
end
|
26
26
|
alias dit_dah encode_with
|
27
27
|
|
28
|
+
def wave
|
29
|
+
MorseCode::Wave.new(encode).generate
|
30
|
+
end
|
31
|
+
|
28
32
|
private
|
29
33
|
|
30
34
|
def encode_word(word)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module MorseCode
|
2
|
+
class Sample
|
3
|
+
DIT_LENGTH = 60
|
4
|
+
DAH_LENGTH = 3 * DIT_LENGTH
|
5
|
+
DIT_SPACE = DIT_LENGTH
|
6
|
+
CHAR_SPACE = 3 * DIT_LENGTH
|
7
|
+
WORD_SPACE = 7 * DIT_LENGTH
|
8
|
+
|
9
|
+
attr_reader :message, :frequency, :sample_rate
|
10
|
+
|
11
|
+
def initialize(message, frequency = 600, sample_rate = 8000)
|
12
|
+
@message = message
|
13
|
+
@frequency = frequency
|
14
|
+
@sample_rate = sample_rate
|
15
|
+
end
|
16
|
+
|
17
|
+
# 8-bit unsigned PCM format
|
18
|
+
def pcm_samples
|
19
|
+
@pcm_samples ||= [].tap do |pcm_samples|
|
20
|
+
samples.each { |sample| pcm_samples.push(128 + (127 * sample).round) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def samples
|
27
|
+
@samples ||= [].tap do |samples|
|
28
|
+
counter = 2 * Math::PI * frequency / sample_rate
|
29
|
+
return samples if timings.empty?
|
30
|
+
|
31
|
+
flag = timings.first > 0 ? 1 : 0
|
32
|
+
timings.each do |time|
|
33
|
+
duration = sample_rate * time.abs / 1000
|
34
|
+
0.upto(duration).each do |i|
|
35
|
+
samples.push(flag * Math.sin(i * counter))
|
36
|
+
end
|
37
|
+
flag = 1 - flag
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def timings
|
43
|
+
@timings ||= [].tap do |timings|
|
44
|
+
message.each_char do |char|
|
45
|
+
case char
|
46
|
+
when '.' then timings.push(DIT_LENGTH); timings.push(-DIT_SPACE)
|
47
|
+
when '-' then timings.push(DAH_LENGTH); timings.push(-DIT_SPACE)
|
48
|
+
when ' ' then timings.pop; timings.push(-CHAR_SPACE)
|
49
|
+
when '/' then timings.pop; timings.push(-WORD_SPACE)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
timings.pop if timings.last == -DIT_SPACE
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/morse_code/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'wavefile'
|
2
|
+
require 'digest'
|
3
|
+
module MorseCode
|
4
|
+
class Wave
|
5
|
+
include WaveFile
|
6
|
+
|
7
|
+
attr_reader :message
|
8
|
+
|
9
|
+
def initialize(message, frequency = 600, sample_rate = 8000)
|
10
|
+
@message = message
|
11
|
+
@sample_rate = sample_rate
|
12
|
+
@sample = MorseCode::Sample.new(message, frequency, sample_rate)
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate
|
16
|
+
buffer = WaveFile::Buffer.new(pcm_samples, WaveFile::Format.new(:mono, :float, @sample_rate))
|
17
|
+
WaveFile::Writer.new(filepath, WaveFile::Format.new(:mono, :pcm_16, @sample_rate)) do |writer|
|
18
|
+
writer.write(buffer)
|
19
|
+
end
|
20
|
+
filepath
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def filepath
|
26
|
+
"/tmp/morse_code-#{filename}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def filename
|
30
|
+
"#{Digest::MD5.hexdigest(message)[0, 10]}.wav"
|
31
|
+
end
|
32
|
+
|
33
|
+
def pcm_samples
|
34
|
+
@pcm_samples ||= @sample.pcm_samples
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: morse-code-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- YingRui Lu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mocha
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.7'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.7'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: pry
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +150,20 @@ dependencies:
|
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0.59'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.16'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.16'
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
168
|
name: thor
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +178,20 @@ dependencies:
|
|
150
178
|
- - "~>"
|
151
179
|
- !ruby/object:Gem::Version
|
152
180
|
version: '0.19'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: wavefile
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '1.0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '1.0'
|
153
195
|
description:
|
154
196
|
email:
|
155
197
|
- luyingrui518@gmail.com
|
@@ -171,7 +213,9 @@ files:
|
|
171
213
|
- lib/morse_code/encoders/chinese.rb
|
172
214
|
- lib/morse_code/encoders/english.rb
|
173
215
|
- lib/morse_code/error.rb
|
216
|
+
- lib/morse_code/sample.rb
|
174
217
|
- lib/morse_code/version.rb
|
218
|
+
- lib/morse_code/wave.rb
|
175
219
|
homepage: https://github.com/superiorlu/morse_code
|
176
220
|
licenses:
|
177
221
|
- MIT
|
@@ -193,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
237
|
version: '0'
|
194
238
|
requirements: []
|
195
239
|
rubyforge_project:
|
196
|
-
rubygems_version: 2.7.
|
240
|
+
rubygems_version: 2.7.6
|
197
241
|
signing_key:
|
198
242
|
specification_version: 4
|
199
243
|
summary: Simple Morse Code Encode and Decode Tool
|