File size: 3,132 Bytes
0338d23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import base64
from io import BytesIO

import scipy.io.wavfile as wav
import streamlit as st

from brainwave.config.app import (
    BASE_FREQUENCY_DEFAULT,
    BASE_FREQUENCY_RANGE_MAX,
    BASE_FREQUENCY_RANGE_MIN,
    BASE_FREQUENCY_STEP,
    BEAT_FREQUENCY_RANGE_MAX,
    BEAT_FREQUENCY_RANGE_MIN,
    BRAIN_WAVES,
    DURATION_DEFAULT,
    DURATION_RANGE_MAX,
    DURATION_RANGE_MIN,
)
from brainwave.utils.binaural_beats import generate_binaural_beats


def app():
    st.title('Binaural Beats Generator')

    st.subheader('Brain Wave Selection')
    selected_wave: str = st.selectbox(
        'Select a type of brain wave:', list(BRAIN_WAVES.keys())
    )
    default_beat: int = BRAIN_WAVES[selected_wave]

    st.subheader('Base Frequency (Hz)')
    base_frequency: int = st.slider(
        'Base Frequency (Hz):',
        min_value=BASE_FREQUENCY_RANGE_MIN,
        max_value=BASE_FREQUENCY_RANGE_MAX,
        value=BASE_FREQUENCY_DEFAULT,
        step=BASE_FREQUENCY_STEP,
    )
    base_frequency_input: int = st.number_input(
        '...or enter the base frequency using the keyboard:',
        min_value=BASE_FREQUENCY_RANGE_MIN,
        max_value=BASE_FREQUENCY_RANGE_MAX,
        value=base_frequency,
        step=BASE_FREQUENCY_STEP,
    )

    st.subheader('Beat Frequency (Hz)')
    beat_frequency: int = st.slider(
        'Select the beat frequency using the slider:',
        min_value=BEAT_FREQUENCY_RANGE_MIN,
        max_value=BEAT_FREQUENCY_RANGE_MAX,
        value=default_beat,
    )
    beat_frequency_input: int = st.number_input(
        '...or enter the beat frequency using the keyboard:',
        min_value=BEAT_FREQUENCY_RANGE_MIN,
        max_value=BEAT_FREQUENCY_RANGE_MAX,
        value=beat_frequency,
    )

    st.subheader('Duration (seconds)')
    duration: int = st.slider(
        'Duration (seconds):',
        min_value=DURATION_RANGE_MIN,
        max_value=DURATION_RANGE_MAX,
        value=DURATION_DEFAULT,
    )
    duration_input: int = st.number_input(
        '...or enter the duration using the keyboard:',
        min_value=DURATION_RANGE_MIN,
        max_value=DURATION_RANGE_MAX,
        value=duration,
    )

    base_frequency = base_frequency_input
    beat_frequency = beat_frequency_input
    duration = duration_input

    if st.button('Generate Sound'):
        audio_data, sample_rate = generate_binaural_beats(
            base_frequency, beat_frequency, duration
        )
        wav_file: BytesIO = BytesIO()
        wav.write(wav_file, sample_rate, audio_data)
        wav_file.seek(0)

        b64: str = base64.b64encode(wav_file.read()).decode()
        audio_html: str = (
            f'<audio controls loop><source src="data:audio/wav;base64,{b64}" '
            f'type="audio/wav"></audio>'
        )
        st.markdown(audio_html, unsafe_allow_html=True)

        href: str = (
            f'<a href="data:file/wav;base64,{b64}" download="'
            f'binaural_beats_{selected_wave}.wav">Download '
            f'{selected_wave} Binaural Beat</a>'
        )
        st.markdown(href, unsafe_allow_html=True)


if __name__ == '__main__':
    app()