summaryrefslogtreecommitdiff
path: root/voice_changer.sh
blob: b381dc52f85bff1fab5870b799c66701ccb60ae4 (plain)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash

set -e

MIC_NAME=""
MIC_SOURCE=""
SINK_SOURCE=""
SWAP_FLAG=0

function load_sinks ()
{
    if [[ -z "$(pactl list short modules | grep "VoiceChangerSink")" ]]; then
        pactl load-module module-null-sink sink_name=VoiceChangerSink
    else
        echo -e "\nSinks already loaded."
    fi
}

function configure_mic ()
{
    MIC_NAME=$( pactl list source-outputs | grep -B 17 "WEBRTC VoiceEngine" | grep "Source Output \#" | sed -r "s|^.*\#||g" )
    MIC_SOURCE=$( pactl list source-outputs | grep -B 17 "WEBRTC VoiceEngine" | grep "Source\:" | sed -r "s|^.*\:\ ||g" )
    SINK_SOURCE=$( pactl list sources | grep -B 3 "VoiceChangerSink.monitor" | grep "Source \#" | sed -r "s|^.*\#||g" )
    MIC_DEFAULT=$( pactl list sources | grep -B 3 "alsa_input.usb-C-Media_Electronics_Inc._YMC_1040-00.mono-fallback" | grep "Source \#" | sed -r "s|^.*\#||g" )
}

function toggle ()
{
    if [[ "$MIC_SOURCE" -ne "$SINK_SOURCE" ]]; then
        pactl move-source-output "$MIC_NAME" "VoiceChangerSink.monitor" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$SINK_SOURCE" "VOICHANG"
    else
        pactl move-source-output "$MIC_NAME" "$MIC_DEFAULT" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$MIC_DEFAULT" "VOICHANG"
    fi
}

function normal ()
{
    sox -t pulseaudio default -t pulseaudio VoiceChangerSink
}

function bladewolf ()
{
    if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
        pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
        while [[ -n $(pgrep -f "sox") ]]; do
            :
        done 
        nohup sh -c "sox -t pulseaudio default -p pitch -225 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch +75 echo 0.4 0.8 40 0.8 gain +7.5 bass +25" >/dev/null 2>&1 &
    else
        echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
    fi
}

function demonbot ()
{
    if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
        pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
        while [[ -n $(pgrep -f "sox") ]]; do
            :
        done 
        nohup sh -c "sox -t pulseaudio default -p pitch -225 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch -75 echo 0.4 0.8 40 0.8 gain +7.5 bass +25" >/dev/null 2>&1 &
    else
        echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
    fi
}

function looper ()
{
    # gain +7.5
    if [[ $SWAP_FLAG -eq 1 || -z $( pgrep -f "sox" ) ]]; then
        pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
        while [[ -n $(pgrep -f "sox") ]]; do
            :
        done 
        nohup sh -c "sox -t pulseaudio default -p pitch +15 | sox - -m -t pulseaudio default -t pulseaudio VoiceChangerSink pitch -15 echo 0.4 0.8 30 0.75 bass +25 treble +12" >/dev/null 2>&1 &
    else
        echo -e "\nOne voice is already loaded and a swap wasn't explicitly requested."
    fi
}

function unload_sinks ()
{
    read -r -p "Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ "$response" =~ ^(yes|y)$ ]]; then
        pactl move-source-output "$MIC_NAME" "$MIC_DEFAULT" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$MIC_DEFAULT" "VOICHANG"
        pgrep -f "sox" >/dev/null 2>&1 && pkill -f "sox"
        while [[ -n $(pgrep -f "sox") ]]; do
            :
        done        
        pactl list short modules | grep "VoiceChangerSink" | cut -f1 | xargs -L1 pactl unload-module
        echo -e "\nSinks unloaded."
    else
        echo -e "\nSink unloading aborted."
    fi
}

[[ -z $( grep -E "^alsa_output.pci-0000_03_04.0.analog-stereo$" $HOME/.config/pulse/* ) || -z $( grep -E "^alsa_input.pci-0000_03_04.0.iec958-stereo$" $HOME/.config/pulse/* ) ]] \
&& $HOME/stuf/scripts/notification_wrapper.sh "\nSYSTEM CHANGE DETECTED, TERMINATING PROGRAM" "VOICHANG" && exit

load_sinks
looper
configure_mic

while getopts "hlunrt" opt; do
    case $opt in
    h) echo -e "usage: $0 [-h help] [-n notify-send sinks] [-l load sinks] [-u unload sinks] [-r reset sinks]\n\nSuggested Keyboard Shortcuts:\n"; printf '%s\n' "${SHORTCUTS[@]}";  exit ;;        # PRINT HELP IN TERMINAL
    l) load_sinks; exit ;;                                                                                                                                                                          # LOAD ALL SINKS
    u) unload_sinks; exit ;;                                                                                                                                                                        # UNLOAD ALL SINKS
    # n) notify_sinks; exit ;;                                                                                                                                                                        # LIST ALL SINKS VIA WRAPPER
    # r) reset_sinks; exit ;;                                                                                                                                                                         # RESET ALL SINKS
    t) toggle; exit;;    
    ?) echo "error: option -$OPTARG is not implemented"; exit ;;
    esac
done


#trap 'echo "penis"' SIGINFO
#trap cleanup EXIT