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 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