File size: 3,264 Bytes
efabbbd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import numpy as np
import sounddevice as sd

def generate_tone(freq, duration=1.0, sample_rate=44100, volume=0.1):
    t = np.linspace(0, duration, int(sample_rate * duration), False)
    return (volume * np.sin(2 * np.pi * freq * t)).astype(np.float32)

def play_tone(freq, volume):
    tone = generate_tone(freq, volume=volume)
    sd.play(tone, samplerate=44100, blocking=True)
    return f"Played tone at {freq} Hz"

def calculate_sequence_frequencies(tinnitus_freq):
    return [
        int(tinnitus_freq * 0.77),
        int(tinnitus_freq * 0.9),
        int(tinnitus_freq * 1.1),
        int(tinnitus_freq * 1.4)
    ]

def play_sequence(tinnitus_freq, volume):
    frequencies = calculate_sequence_frequencies(tinnitus_freq)
    sequence = []
    for freq in frequencies:
        tone = generate_tone(freq, duration=0.5, volume=volume)
        sequence.extend(tone)
        sequence.extend(np.zeros(int(44100 * 0.1)))  # 0.1s pause between tones
    
    sd.play(np.array(sequence), samplerate=44100, blocking=True)
    return f"Played sequence: {frequencies} Hz"

def update_frequencies(tinnitus_freq):
    frequencies = calculate_sequence_frequencies(tinnitus_freq)
    return f"frequencies used in sequence: {', '.join(map(str, frequencies))}"

with gr.Blocks(title="ACRN Tinnitus Protocol") as demo:
    gr.Markdown(
    """
    # ACRN Tinnitus Protocol
    
    This is my attempt at implementing the Acoustic Coordinated Reset Neuromodulation tinnitus treatment protocol using [this paper](https://link-to-paper) as a guide.
    
    - First lower the volume on your device, so it is not too loud to start.
    - Start the tone by pressing the "Play Tone" button.
    - Adjust the frequency slider until it matches your tinnitus tone. You can also type in the frequency if you know it already.
    - Adjust the volume until it is a little bit louder than your tinnitus tone.
    - Switch from "Tone" to "Sequence" mode
    
    Inspired by [this thread on tinnitustalk.com](https://link-to-thread) and [this reddit thread](https://link-to-reddit-thread).
    """
    )

    with gr.Row():
        tone_btn = gr.Button("Tone")
        sequence_btn = gr.Button("Sequence")
    
    with gr.Row():
        freq_slider = gr.Slider(minimum=100, maximum=20000, value=12694, step=1, label="Frequency")
        freq_number = gr.Number(value=12694, label="Frequency")
    
    volume_slider = gr.Slider(minimum=0.01, maximum=1.0, value=0.1, step=0.01, label="Volume")
    
    output = gr.Textbox(label="Output")
    freq_output = gr.Markdown()

    def update_freq(value, slider):
        return gr.Number.update(value=value) if slider else gr.Slider.update(value=value)

    freq_slider.change(update_freq, inputs=[freq_slider, gr.State(True)], outputs=freq_number)
    freq_number.change(update_freq, inputs=[freq_number, gr.State(False)], outputs=freq_slider)
    
    freq_slider.change(update_frequencies, inputs=[freq_slider], outputs=[freq_output])
    freq_number.change(update_frequencies, inputs=[freq_number], outputs=[freq_output])

    tone_btn.click(play_tone, inputs=[freq_slider, volume_slider], outputs=[output])
    sequence_btn.click(play_sequence, inputs=[freq_slider, volume_slider], outputs=[output])

demo.launch()