morse-code-rb 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Gem Version](http://img.shields.io/gem/v/morse-code-rb.svg)](https://rubygems.org/gems/morse-code-rb) [![Build Status](https://travis-ci.org/superiorlu/morse_code.svg)](https://travis-ci.org/superiorlu/morse_code) [![Maintainability](https://api.codeclimate.com/v1/badges/62b6eb7ed9b65c62d3f6/maintainability)](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [![GitHub license](https://img.shields.io/github/license/superiorlu/morse_code.svg)](https://github.com/superiorlu/morse_code/blob/master/LICENSE.md)
|
5
|
+
[![Gem Version](http://img.shields.io/gem/v/morse-code-rb.svg)](https://rubygems.org/gems/morse-code-rb) [![Build Status](https://travis-ci.org/superiorlu/morse_code.svg)](https://travis-ci.org/superiorlu/morse_code) [![Maintainability](https://api.codeclimate.com/v1/badges/62b6eb7ed9b65c62d3f6/maintainability)](https://codeclimate.com/github/superiorlu/morse_code/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/62b6eb7ed9b65c62d3f6/test_coverage)](https://codeclimate.com/github/superiorlu/morse_code/test_coverage) [![GitHub license](https://img.shields.io/github/license/superiorlu/morse_code.svg)](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
|