fork download
  1. #!ruby
  2. # -*- encoding: UTF-8 -*-
  3.  
  4. =begin
  5. 入力をモールス符号に変換
  6. 入力は [A-Za-z0-9 ]
  7. 出力は OutputWav
  8. =end
  9.  
  10. OutputWav = 'Morse.wav'
  11.  
  12. Morse = {
  13. ' ' => '0000', # 文字間隔は短点3つ分、語間隔は短点7つ分 4 = 7-3
  14. 'A' => '・-',
  15. 'B' => '-・・・',
  16. 'C' => '-・-・',
  17. 'D' => '-・・',
  18. 'E' => '・',
  19. 'F' => '・・-・',
  20. 'G' => '--・',
  21. 'H' => '・・・・',
  22. 'I' => '・・',
  23. 'J' => '・---',
  24. 'K' => '-・-',
  25. 'L' => '・-・・',
  26. 'M' => '--',
  27. 'N' => '-・',
  28. 'O' => '---',
  29. 'P' => '・--・',
  30. 'Q' => '--・-',
  31. 'R' => '・-・',
  32. 'S' => '・・・',
  33. 'T' => '-',
  34. 'U' => '・・-',
  35. 'V' => '・・・-',
  36. 'W' => '・--',
  37. 'X' => '-・・-',
  38. 'Y' => '-・--',
  39. 'Z' => '--・・',
  40. '0' => '-----',
  41. '1' => '・----',
  42. '2' => '・・---',
  43. '3' => '・・・--',
  44. '4' => '・・・・-',
  45. '5' => '・・・・・',
  46. '6' => '-・・・・',
  47. '7' => '--・・・',
  48. '8' => '---・・',
  49. '9' => '----・',
  50. }
  51. Morse2 = {
  52. '・' => '1',
  53. '-' => '2' # '111'
  54. }
  55.  
  56. # str = 'JJY JJY N N N N N'.strip.upcase
  57. str = gets.strip.upcase
  58.  
  59. soundData = ''
  60. str.each_char{|ch|
  61. next unless Morse[ch]
  62. soundData << Morse[ch].chars.map{|x| Morse2[x] }.join('0')
  63. soundData << '000'
  64. }
  65. soundData.sub!( /0+$/, '' )
  66. # puts soundData
  67.  
  68. # wav Output
  69.  
  70. Samp_freq = 8000 # サンプリングレート 8KHz
  71. Numb_Ch = 1 # チャンネル数 1
  72. DotSec = 60.0 / 50.0 / 17.0 # 17 WPM
  73. DotLen = (DotSec * Samp_freq).to_i
  74.  
  75. Morse_freq = 770 # Wav モールス周波数 770Hz
  76.  
  77. # 無音1Dot, 有音1Dot(短音), 有音3Dot(長音)
  78. wavData0 = "\x80" * DotLen
  79. wavData1 = ""
  80. SoundVol = 0.6
  81. DotLen.times{|x| wavData1 << [SoundVol * 0x80 * Math.sin( x * 2 * Math::PI * Morse_freq / Samp_freq ) + 0x80].pack('C') }
  82. wavData2 = ""
  83. (3*DotLen).times{|x| wavData2 << [SoundVol * 0x80 * Math.sin( x * 2 * Math::PI * Morse_freq / Samp_freq ) + 0x80].pack('C') }
  84.  
  85. soundData.prepend('00') # wav ガード
  86. soundData << '00' # wav ガード
  87.  
  88. wavDataSize = soundData.chars.inject(0){|result, item|
  89. result +
  90. case item
  91. when '0'; wavData0.size
  92. when '1'; wavData1.size
  93. when '2'; wavData2.size
  94. end
  95. }
  96.  
  97. File.open( OutputWav, 'wb' ){|fh|
  98. fh.write( "RIFF" )
  99. fh.write( [28 + wavDataSize+8].pack('V') )
  100. fh.write( "WAVEfmt " )
  101. fh.write( [16].pack('V') )
  102. fh.write( [1, Numb_Ch, Samp_freq, Samp_freq, 1, 8].pack('vvVVvv') )
  103.  
  104. fh.write( "data" )
  105. fh.write( [wavDataSize].pack('V') )
  106. soundData.chars{|ch|
  107. case ch
  108. when '0'; fh.write( wavData0 )
  109. when '1'; fh.write( wavData1 )
  110. when '2'; fh.write( wavData2 )
  111. end
  112. }
  113. }
  114.  
  115.  
Runtime error #stdin #stdout #stderr 0.02s 6316KB
stdin
JJY JJY  N N N N N
stdout
Standard output is empty
stderr
prog.rb:97:in `initialize': Permission denied @ rb_sysopen - Morse.wav (Errno::EACCES)
	from prog.rb:97:in `open'
	from prog.rb:97:in `<main>'