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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c054c4bd196b1c6b5f94bed7a2cdf1e6ec5ca3f88d894895409e92b6e23ffa35
4
- data.tar.gz: e55557f5696b0f0f723f60e8b10a5560723fd065447f99107c1db2fd6deae7ee
3
+ metadata.gz: d462b9a026bf1b78899a3658c9f1aea1724c55e3a667885411643e7d5cf87bba
4
+ data.tar.gz: 863ca3cca3e2aeafabbd8af2dbc38e5a3d789c43a6d4a792992d7de803fbcd79
5
5
  SHA512:
6
- metadata.gz: 4346ca4e6cfcd235cb4fffdcf522cf4dfba0b588a5affde4f47d3ddd7b86dd2e005fe39743bf1d30bbd3f11285d2584441225107ccaab172f4190ece69f1d8a8
7
- data.tar.gz: 41504f9978c115307745703d532be5cb53b3dca42e21f943adc226054fee900dcf46dafc54fb272fd7c3670114c2f2153dce2adce9e8fd605228e570e9153eda
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
- $> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
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
- $> "DAHDAHDITDITDITDAHDITDITDITDITDAHDITDITDITDAH DAHDAHDITDITDAHDAHDITDITDITDAHDITDAHDAHDAHDAH DAHDITDITDAHDAHDAHDITDITDITDAHDITDAHDAHDITDAH DAHDITDAHDITDAHDAHDITDAHDAHDAHDAHDAHDAHDITDAH DAHDITDITDAHDAHDAHDITDAHDITDAHDAHDAHDITDAHDIT"
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
- $> "I AM ROBOT."
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
- $> "I AM ROBOT."
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
- $> "DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH"
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
- $> "I AM ROBOT."
117
+ => "I AM ROBOT."
91
118
 
92
119
  $> mc -d 'DITDIT / DITDAH DAHDAH / DITDAHDIT DAHDAHDAH DAHDITDITDIT DAHDAHDAH DAH DITDAHDITDAHDITDAH' --dit-dah
93
- $> "I AM ROBOT."
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
@@ -2,6 +2,8 @@ require 'morse_code/version'
2
2
  require 'morse_code/error'
3
3
  require 'morse_code/encoder'
4
4
  require 'morse_code/decoder'
5
+ require 'morse_code/sample'
6
+ require 'morse_code/wave'
5
7
  require 'morse_code/cli'
6
8
 
7
9
  module MorseCode
@@ -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 MorseCode::Encoder.new(message).dit_dah
17
+ puts encoder.dit_dah
16
18
  else
17
- puts MorseCode::Encoder.new(message).encode
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
 
@@ -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'); message.gsub!('-', 'DAH') }
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MorseCode
4
- VERSION = '0.3.1'
4
+ VERSION = '0.4.0'.freeze
5
5
  end
@@ -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.3.1
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-23 00:00:00.000000000 Z
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.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