-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmomorse.py
75 lines (57 loc) · 2.11 KB
/
momorse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import numpy as np
import simpleaudio as sa
def generate_tone(frequency, duration, sample_rate=44100, volume=0.3):
t = np.linspace(0, duration, int(sample_rate * duration), False)
if frequency == 0:
return np.zeros_like(t)
tone = np.sin(frequency * t * 2 * np.pi) * volume
base_frequency = 500
base_fade_ratio = 0.06
fade_ratio = max(base_fade_ratio * (base_frequency / frequency), 0.05)
fade_samples = int(sample_rate * duration * fade_ratio)
max_fade_samples = int(sample_rate * 0.01)
fade_in_samples = min(fade_samples, max_fade_samples)
fade_out_samples = fade_in_samples
# 페이드 인
for i in range(fade_in_samples):
tone[i] *= (i / fade_in_samples)
# 페이드 아웃
for i in range(fade_out_samples):
tone[-i-1] *= (i / fade_out_samples)
return tone
def play_audio(audio):
audio = audio * (2**15 - 1) / np.max(np.abs(audio))
audio = audio.astype(np.int16)
play_obj = sa.play_buffer(audio, 1, 2, sample_rate)
play_obj.wait_done()
# options
dot_duration = 0.05 # .
dash_duration = dot_duration*3 # .
char_duration = dot_duration*3 # btw char ' '
word_duration = dot_duration*7 # btw word '/'
sample_rate = 44100 # sampling rate
frequency = 500 # Hz
# var
signal = np.array([], dtype=np.float32)
message = ".... . .-.. .-.. --- ..--../-. .. -.-. ./- ---/-- . . -/-.-- --- ..-"
dash_tone = generate_tone(frequency, dash_duration, sample_rate)
dot_tone = generate_tone(frequency, dot_duration, sample_rate)
char_tone = generate_tone(0, char_duration, sample_rate)
word_tone = generate_tone(0, word_duration, sample_rate)
for element in message:
if element == '.':
tone = dot_tone
elif element == '-':
tone = dash_tone
elif element == ' ':
tone = char_tone
elif element == '/':
tone = word_tone
else:
pass
signal = np.concatenate((signal, tone))
# 요소 사이와 마지막 요소 이후에는 정적 추가
silence = np.zeros(int(sample_rate * 0.1))
signal = np.concatenate((signal, silence))
# play
play_audio(signal)