GLaDOS is “Still Alive”…in Shell!

Thanksgiving vacation was very entertaining. For me at least. I had five and a half days off from school, and over maybe two of those days, I worked for a few hours on some unfinished projects I had on my computer. I found a program based on the end of Portal that I started to write several months ago, designed to look like the terminal as GLaDOS sings “Still Alive”. Unlike the original, I was planning to sync the lyrics to the nearest syllable, to make it look like GLaDOS was typing EXACTLY as she sang. I also wanted to include the original ASCII art, including some that was never actually used. But at 7,360 lines (!), and not even one page completed (!!!), it was time to try a different approach. Mainly figuring out how to leave the cursor where I need it instead of retyping the whole screen whenever a character was added. Which helped with fixing errors, since I now only have to fix the syllable, thousands of near duplicates.

The first problem I faced with this is timing. I opened the music in audacity, typed the lyrics in a label track, and exported them. Simple enough. Now I told my program to wait the correct duration between each character. I played the song, and even though the start matched, the end didn’t. As fast as computers are, nothing is instant. Shell is slower than some other programming languages, like C, and there were so many commands executed by my program, the text was noticeably slower than the music. The command “date +%s%N” quickly became my friend, allowing me to time everything from Midnight, January 1st, 1970, in seconds with nanosecond accuracy. There’s still a delay, but not a noticeable drift. Here is the timing code, which I saved as “~/bin/PreciseWait.sh”:

StartTime=$1
EndTime=$2
Unfinished=1
while [ $Unfinished = '1' ]
    do
        CurrentTime=`date +'%s.%N'`
        ElapsedTime=`echo "$CurrentTime - $StartTime" | bc`
        Unfinished=`echo "$ElapsedTime < $EndTime" | bc`
    done

I can call this with “PreciseWait.sh [when my program started] [when to stop waiting]“. I fed this through a program I wrote to “type” for me. I used the standard escape characters (like “\n” for new line), and was forced to create my own escape characters, partly for convenience, and partly because I didn’t know how to properly handle spaces. “~/bin/type.sh” looks like this:

#program start time (seconds.nanoseconds)
ProgramStart=$1
#time to start/end text segment
TextStart=`echo "$2" | bc`
TextEnd=`echo "$3" | bc`
#text to display
Text=$4

#find real number of characters
TextLength=${#Text}
EndLength=$TextLength
for (( i = 1; i <= TextLength; i++ ))
    do
        TempText=`expr substr $Text $i 1`
        if [ $TempText = '\' ]
            then
                i=$i+1
                EndLength=`echo "$EndLength-1" | bc`
            fi
    done

#find duration of one character
CharDur=`echo "scale=9; ( $TextEnd - $TextStart ) / $EndLength" | bc` #"scale" is # of places after decimal

TextLength=${#Text}
CharEnd=$TextStart
#wait until start time
PreciseWait.sh $ProgramStart $TextStart
#start typing
for (( i = 1; i <= TextLength; i++ ))
    do
#type normal char if TRUE, escape code (real or mine) if FALSE
        NormalPrint='TRUE'
#get next character
        TempText=`expr substr $Text $i 1`
#Escape code! Get the next letter too!
        if [ $TempText = '\' ]
            then
                TempText=`expr substr $Text $i 2`
                i=$i+1
            fi
#simulate a normal backspace, "\b" is more like the left arrow key
        if [ $TempText = '\B' ]
            then
                NormalPrint='FALSE'
                echo -e -n "\b \b"
            fi
#clear the screen
        if [ $TempText = '\C' ]
            then
                NormalPrint='FALSE'
                clear
            fi
#If you know how to display a space NORMALLY, let me know @ http://nngprojects.wordpress.com/2011/12/03/glados-is-still-alive-in-shell/
        if [ $TempText = '\S' ]
            then
                NormalPrint='FALSE'
                echo -n " "
            fi
#display normal and (standard) escape characters
        if [ $NormalPrint = 'TRUE' ]
            then
                echo -n -e "$TempText"
            fi
#wait until it's time for the next character
        CharEnd=`echo "$CharEnd+$CharDur" | bc`
        PreciseWait.sh $ProgramStart $CharEnd
    done

This can be run with “type.sh [song start time] [text start time] [text end time] [text]“. The last three fields are exactly what Audacity outputs on every line of a lyric file. The first field is from the program playing the song, “~/bin/StillAlive.sh”, which is run as “StillAlive.sh”, in a full screen terminal for best effect. It looks like this:

mplayer -msglevel all=-1
echo 'Please wait a few seconds.'
echo 'Some errors will appear,   |\_/|'
echo 'the screen will clear,     |0 0|__'
echo 'and Wheatley will make     =-*-=__\'
echo 'a fool of himself.        c_c__(___)'
sleep 6
StartTime=`date +'%s.%N'`
mplayer -msglevel all=-1 ~/StillAlive.flac &
sleep 4
clear
echo -n 'wheatley@GLaDOS:~$ '
type.sh $StartTime    4.5    5.5    'powerup'
type.sh $StartTime    6    9.249029    "\CForms\SFORM-29827281-12:\nTest\SAssessment\SReport\n\n\n"
StartTime=$StartTime-10
type.sh $StartTime    0.249029    0.498989    "This\S"
type.sh $StartTime    0.498989    0.748326    "was\S"
type.sh $StartTime    0.748326    0.999532    "a\S"
type.sh $StartTime    0.999532    1.249492    "tri"
type.sh $StartTime    1.249492    1.384757    "umph.\n"
type.sh $StartTime    3.997805    4.249635    "I'm\S"
type.sh $StartTime    4.249635    4.496478    "ma"
type.sh $StartTime    4.496478    4.749555    "king\S"
type.sh $StartTime    4.749555    5.000138    "a\S"
type.sh $StartTime    5.000138    5.498812    "note\S"
type.sh $StartTime    5.498812    6.248068    "here:\n"
type.sh $StartTime    6.248068    6.749235    "HUGE\S"
type.sh $StartTime    6.749235    6.998571    "SUC"
type.sh $StartTime    6.998571    7.505971    "CESS.\n"
type.sh $StartTime    8.997628    9.250081    "It's\S"
type.sh $StartTime    9.250081    9.751248    "hard\S"
type.sh $StartTime    9.751248    10.000273    "to\S"
type.sh $StartTime    10.000273    10.725219    "o"
type.sh $StartTime    10.725219    10.999893    "vers"
type.sh $StartTime    10.999893    11.497387    "tate\n"
type.sh $StartTime    11.497387    12.023701    "my\S"
type.sh $StartTime    12.023701    12.711851    "sat"
type.sh $StartTime    12.711851    12.987648    "is"
type.sh $StartTime    12.987648    13.509205    "fac"
type.sh $StartTime    13.509205    13.965227    "tion\n"
type.sh $StartTime    16.248064    16.498603    "Ap"
type.sh $StartTime    16.498603    16.749141    "er"
type.sh $StartTime    16.749141    17.000363    "ture\S"
type.sh $StartTime    17.000363    17.250901    "Sci"
type.sh $StartTime    17.250901    17.739008    "ence:\n"
type.sh $StartTime    19.994197    20.249856    "We\S"
type.sh $StartTime    20.249856    20.496981    "do\S"
type.sh $StartTime    20.496981    20.745472    "what\S"
type.sh $StartTime    20.745472    21.002155    "we\S"
type.sh $StartTime    21.002155    21.217877    "must\n"
type.sh $StartTime    21.753088    22.001579    "be"
type.sh $StartTime    22.001579    22.482176    "cause\S"
type.sh $StartTime    22.74432    23.003733    "we\S"
type.sh $StartTime    23.003733    23.500715    "can:\n"
type.sh $StartTime    25.24288    25.748053    "For\S"
type.sh $StartTime    25.748053    25.996544    "the\S"
type.sh $StartTime    25.996544    26.752939    "good\S"
type.sh $StartTime    26.752939    26.995968    "of\S"
type.sh $StartTime    26.995968    27.752363    "all\S"
type.sh $StartTime    27.752363    28.000853    "of\S"
type.sh $StartTime    28.000853    28.230229    "us,\n"
type.sh $StartTime    28.497835    28.751787    "Ex"
type.sh $StartTime    28.751787    28.998229    "cept\S"
type.sh $StartTime    28.998229    29.199616    "the\S"
type.sh $StartTime    29.199616    29.499989    "ones\S"
type.sh $StartTime    29.499989    29.74848    "who\S"
type.sh $StartTime    29.74848    30.002432    "are\S"
type.sh $StartTime    30.002432    30.242731    "dead.\n\n\n"
type.sh $StartTime    30.776576    30.892629    "But\S"
type.sh $StartTime    30.996395    31.195733    "there's\S"
type.sh $StartTime    31.217579    31.715925    "no\S"
type.sh $StartTime    31.730944    32.099584    "sense\S"
type.sh $StartTime    32.244309    32.500992    "cry"
type.sh $StartTime    32.500992    32.749483    "ing\n"
type.sh $StartTime    32.749483    32.993195    "o"
type.sh $StartTime    32.993195    33.243051    "ver\S"
type.sh $StartTime    33.243051    33.499051    "ev"
type.sh $StartTime    33.499051    33.746859    "ery\S"
type.sh $StartTime    33.746859    34.232917    "mis"
type.sh $StartTime    34.232917    34.690987    "take.\n"
type.sh $StartTime    34.744235    35.000917    "You\S"
type.sh $StartTime    35.000917    35.246677    "just\S"
type.sh $StartTime    35.246677    35.6672    "keep\S"
type.sh $StartTime    35.743659    36.235179    "on\S"
type.sh $StartTime    36.235179    36.495957    "try"
type.sh $StartTime    36.495957    36.733525    "ing\n"
type.sh $StartTime    36.733525    36.95744    "till\S"
type.sh $StartTime    36.95744    37.238699    "you\S"
type.sh $StartTime    37.238699    37.498112    "run\S"
type.sh $StartTime    37.498112    37.749333    "out\S"
type.sh $StartTime    37.749333    38.246315    "of\S"
type.sh $StartTime    38.246315    38.691413    "cake.\n"
type.sh $StartTime    38.744661    38.998613    "And\S"
type.sh $StartTime    38.998613    39.132416    "the\S"
type.sh $StartTime    39.132416    39.507883    "Sci"
type.sh $StartTime    39.507883    39.752277    "ence\S"
type.sh $StartTime    39.752277    40.231509    "gets\S"
type.sh $StartTime    40.231509    40.739413    "done.\n"
type.sh $StartTime    40.739413    40.992    "And\S"
type.sh $StartTime    40.992    41.243221    "you\S"
type.sh $StartTime    41.243221    41.499904    "make\S"
type.sh $StartTime    41.499904    41.752491    "a\S"
type.sh $StartTime    41.752491    42.166187    "neat\S"
type.sh $StartTime    42.248107    42.705493    "gun.\n"
type.sh $StartTime    42.746453    43.003136    "For\S"
type.sh $StartTime    43.003136    43.161515    "the\S"
type.sh $StartTime    43.221589    43.501483    "Peo"
type.sh $StartTime    43.501483    43.748608    "ple\S"
type.sh $StartTime    43.748608    43.998464    "who\S"
type.sh $StartTime    43.998464    44.35072    "are\n"
type.sh $StartTime    44.505003    44.745301    "Still\S"
type.sh $StartTime    44.745301    45.225899    "al"
type.sh $StartTime    45.225899    45.987755    "ive."
type.sh $StartTime    45.987755    51.995546    "\CForms:\SFORM-55551-5:\nPersonnel\SFile\SAddendum:\n\nDear\S<>,\n\n"
type.sh $StartTime    51.995546    52.247853    "I'm\S"
type.sh $StartTime    52.247853    52.496318    "not\S"
type.sh $StartTime    52.496318    52.749905    "ev"
type.sh $StartTime    52.749905    52.997089    "en\S"
type.sh $StartTime    52.997089    53.246835    "an"
type.sh $StartTime    53.246835    53.736079    "gry.\n"
type.sh $StartTime    56.24506    56.502489    "I'm\S"
type.sh $StartTime    56.502489    56.749673    "be"
type.sh $StartTime    56.749673    57.00198    "ing\S"
type.sh $StartTime    57.00198    57.72304    "so\S"
type.sh $StartTime    57.72304    57.999681    "sin"
type.sh $StartTime    57.999681    58.500452    "cere\S"
type.sh $StartTime    58.500452    58.998662    "right\S"
type.sh $StartTime    58.998662    59.792725    "now.\n"
type.sh $StartTime    61.229721    61.754827    "E"
type.sh $StartTime    61.754827    62.003291    "ven\S"
type.sh $StartTime    62.003291    62.751247    "though\S"
type.sh $StartTime    62.751247    63.248176    "you\S"
type.sh $StartTime    63.248176    63.724613    "broke\S"
type.sh $StartTime    63.724613    63.996131    "my\S"
type.sh $StartTime    63.996131    64.754332    "heart.\n"
type.sh $StartTime    64.754332    65.000236    "And\S"
type.sh $StartTime    65.000236    65.499726    "killed\S"
type.sh $StartTime    65.499726    66.001778    "me.\n"
type.sh $StartTime    67.99718    68.250767    "And\S"
type.sh $StartTime    68.250767    68.499232    "tore\S"
type.sh $StartTime    68.499232    68.750258    "me\S"
type.sh $StartTime    68.750258    68.998723    "to\S"
type.sh $StartTime    68.998723    69.25103    "pie"
type.sh $StartTime    69.25103    69.738994    "ces.\n"
type.sh $StartTime    71.999509    72.250536    "And\S"
type.sh $StartTime    72.250536    72.499    "threw\S"
type.sh $StartTime    72.499    72.750026    "ev"
type.sh $StartTime    72.750026    73.010018    "ery\S"
type.sh $StartTime    73.010018    73.647829    "piece\S"
type.sh $StartTime    73.727235    73.998753    "in"
type.sh $StartTime    73.998753    74.33687    "to\S"
type.sh $StartTime    74.721093    74.969558    "a\S"
type.sh $StartTime    74.969558    75.443434    "fire.\n"
type.sh $StartTime    77.247044    77.628386    "As\S"
type.sh $StartTime    77.728284    77.951134    "they\S"
type.sh $StartTime    78.007486    78.740073    "burned\S"
type.sh $StartTime    78.740073    79.121735    "it\S"
type.sh $StartTime    79.239563    79.703193    "hurt\S"
type.sh $StartTime    79.741616    79.992642    "be"
type.sh $StartTime    79.992642    80.492132    "cause\n"
type.sh $StartTime    80.492132    80.738036    "I\S"
type.sh $StartTime    80.738036    80.994185    "was\S"
type.sh $StartTime    80.994185    81.240088    "so\S"
type.sh $StartTime    81.240088    81.470622    "ha"
type.sh $StartTime    81.470622    81.716525    "ppy\S"
type.sh $StartTime    81.716525    81.985482    "for\S"
type.sh $StartTime    81.985482    82.413251    "you!\n"
type.sh $StartTime    82.700138    83.002394    "Now\S"
type.sh $StartTime    83.002394    83.243174    "these\S"
type.sh $StartTime    83.243174    83.714488    "points\S"
type.sh $StartTime    83.714488    84.234471    "of\S"
type.sh $StartTime    84.234471    84.488058    "da"
type.sh $StartTime    84.488058    84.739084    "ta\n"
type.sh $StartTime    84.739084    84.982426    "make\S"
type.sh $StartTime    84.982426    85.233452    "a\S"
type.sh $StartTime    85.233452    85.492163    "beau"
type.sh $StartTime    85.492163    85.74575    "ti"
type.sh $StartTime    85.74575    86.08899    "ful\S"
type.sh $StartTime    86.08899    86.747293    "line.\n"
type.sh $StartTime    86.747293    86.995758    "And\S"
type.sh $StartTime    86.995758    87.246784    "we're\S"
type.sh $StartTime    87.246784    87.741152    "out\S"
type.sh $StartTime    87.741152    88.010108    "of\S"
type.sh $StartTime    88.238081    88.49423    "beta.\n"
type.sh $StartTime    88.49423    88.745256    "We"
type.sh $StartTime    88.745256    88.998844    "re\S"
type.sh $StartTime    88.998844    89.24987    "rel"
type.sh $StartTime    89.24987    89.498334    "eas"
type.sh $StartTime    89.498334    89.749361    "ing\S"
type.sh $StartTime    89.749361    90.215552    "on\S"
type.sh $StartTime    90.215552    90.743219    "time.\n"
type.sh $StartTime    90.743219    90.999368    "So\S"
type.sh $StartTime    90.999368    91.250394    "I'm\S"
type.sh $StartTime    91.250394    91.498859    "GLaD\S"
type.sh $StartTime    91.498859    91.749885    "I\S"
type.sh $StartTime    91.749885    92.162285    "got\S"
type.sh $StartTime    92.223761    92.748866    "burned.\n"
type.sh $StartTime    92.748866    93.007577    "Think\S"
type.sh $StartTime    93.007577    93.248357    "of\S"
type.sh $StartTime    93.248357    93.499383    "all\S"
type.sh $StartTime    93.499383    93.758094    "the\S"
type.sh $StartTime    93.758094    93.998874    "things\S"
type.sh $StartTime    93.998874    94.2499    "we\S"
type.sh $StartTime    94.2499    94.749391    "learned\n"
type.sh $StartTime    94.749391    95.00554    "for\S"
type.sh $StartTime    95.00554    95.251443    "the\S"
type.sh $StartTime    95.251443    95.502469    "peo"
type.sh $StartTime    95.502469    95.743249    "ple\S"
type.sh $StartTime    95.743249    95.999398    "who\S"
type.sh $StartTime    95.999398    96.498889    "are\n"
type.sh $StartTime    96.498889    96.752477    "still\S"
type.sh $StartTime    96.752477    96.99838    "al"
type.sh $StartTime    96.99838    97.999923    "ive."
type.sh $StartTime    97.999923    104.244838    "\CForms:\SFORM-55551-6:\nPersonnel\SFile\SAddendum\SAddendum:\n\nOne\Slast\Sthing:\n\n"
type.sh $StartTime    104.244838    104.503548    "Go\S"
type.sh $StartTime    104.503548    104.743048    "ahead\S"
type.sh $StartTime    104.743048    105.0056    "and\S"
type.sh $StartTime    105.0056    105.448738    "leave\S"
type.sh $StartTime    105.4513    106.096796    "me.\n"
type.sh $StartTime    107.99486    108.237562    "I\S"
type.sh $StartTime    108.237562    108.504597    "think\S"
type.sh $StartTime    108.504597    108.753062    "I\S"
type.sh $StartTime    108.753062    108.996403    "pre"
type.sh $StartTime    108.996403    109.444664    "fer\S"
type.sh $StartTime    109.74692    109.839134    "to\S"
type.sh $StartTime    109.839134    110.231042    "stay\S"
type.sh $StartTime    110.727331    110.902152    "in"
type.sh $StartTime    110.902152    111.523712    "side.\n"
type.sh $StartTime    113.246805    113.743787    "May"
type.sh $StartTime    113.743787    113.991595    "be\S"
type.sh $StartTime    114.091947    114.594389    "you'll\S"
type.sh $StartTime    114.732288    115.139157    "find\S"
type.sh $StartTime    115.210155    115.753557    "some\S"
type.sh $StartTime    115.753557    116.000683    "one\S"
type.sh $StartTime    116.000683    116.714752    "else\n"
type.sh $StartTime    116.714752    116.985088    "to\S"
type.sh $StartTime    116.985088    117.499819    "help\S"
type.sh $StartTime    117.499819    118.235733    "you.\n"
type.sh $StartTime    120.234581    120.503901    "May"
type.sh $StartTime    120.503901    120.735716    "be\S"
type.sh $StartTime    120.735716    120.967531    "Black\S"
type.sh $StartTime    120.99955    121.418333    "Me"
type.sh $StartTime    121.418333    121.90848    "sa...\n"
type.sh $StartTime    124.236373    124.432981    "THAT\S"
type.sh $StartTime    124.432981    124.73472    "WAS\S"
type.sh $StartTime    124.73472    124.867157    "A\S"
type.sh $StartTime    124.985941    125.30816    "JOKE.\S"
type.sh $StartTime    125.725952    125.996288    "HA\S"
type.sh $StartTime    125.996288    126.233856    "HA.\S"
type.sh $StartTime    126.233856    126.736299    "\B\B\B\B\B\B\B"
type.sh $StartTime    126.736299    126.861909    "FAT\S"
type.sh $StartTime    126.982059    127.656533    "CHANCE.\n"
type.sh $StartTime    129.226667    129.991253    "Any"
type.sh $StartTime    129.991253    130.695765    "way,\S"
type.sh $StartTime    130.695765    131.184555    "this\S"
type.sh $StartTime    131.184555    131.708843    "cake\S"
type.sh $StartTime    131.708843    131.987371    "is\S"
type.sh $StartTime    131.987371    132.487083    "great.\n"
type.sh $StartTime    132.487083    132.579925    "It's\S"
type.sh $StartTime    132.579925    132.915797    "so\S"
type.sh $StartTime    132.915797    133.248939    "de"
type.sh $StartTime    133.248939    133.497429    "lic"
type.sh $StartTime    133.497429    133.748651    "ious\S"
type.sh $StartTime    133.748651    133.99168    "and\S"
type.sh $StartTime    133.99168    134.300245    "moist.\n"
type.sh $StartTime    134.726229    134.999296    "Look\S"
type.sh $StartTime    134.999296    135.204096    "at\S"
type.sh $StartTime    135.204096    135.717461    "me\S"
type.sh $StartTime    135.717461    136.118869    "still\S"
type.sh $StartTime    136.118869    136.40832    "tal"
type.sh $StartTime    136.40832    136.667733    "king\n"
type.sh $StartTime    136.667733    136.968107    "when\S"
type.sh $StartTime    136.968107    137.200213    "there's\S"
type.sh $StartTime    137.200213    137.47328    "Sci"
type.sh $StartTime    137.47328    137.732693    "ence\S"
type.sh $StartTime    137.732693    138.095872    "to\S"
type.sh $StartTime    138.095872    138.557355    "do.\n"
type.sh $StartTime    138.748501    138.996992    "When\S"
type.sh $StartTime    138.996992    139.245483    "I\S"
type.sh $StartTime    139.245483    139.753387    "look\S"
type.sh $StartTime    139.753387    140.247637    "out\S"
type.sh $StartTime    140.247637    140.512987    "there,\n"
type.sh $StartTime    140.512987    140.703818    "it\S"
type.sh $StartTime    140.703818    140.939475    "makes\S"
type.sh $StartTime    140.939475    141.082919    "me\S"
type.sh $StartTime    141.082919    141.401825    "GLaD\S"
type.sh $StartTime    141.401825    141.656693    "I'm\S"
type.sh $StartTime    141.656693    142.224063    "not\S"
type.sh $StartTime    142.224063    142.738923    "you.\n"
type.sh $StartTime    142.738923    142.941281    "I've\S"
type.sh $StartTime    142.941281    143.233291    "ex"
type.sh $StartTime    143.233291    143.520178    "per"
type.sh $StartTime    143.520178    143.912086    "iments\S"
type.sh $StartTime    143.912086    144.227149    "to\S"
type.sh $StartTime    144.227149    144.701025    "run.\n"
type.sh $StartTime    144.701025    144.980227    "There\S"
type.sh $StartTime    144.980227    145.233815    "is\S"
type.sh $StartTime    145.233815    145.420804    "re"
type.sh $StartTime    145.420804    145.72306    "search\S"
type.sh $StartTime    145.72306    145.989455    "to\S"
type.sh $StartTime    145.989455    146.243042    "be\S"
type.sh $StartTime    146.243042    146.739972    "done.\n"
type.sh $StartTime    146.739972    146.990998    "On\S"
type.sh $StartTime    146.990998    147.239462    "the\S"
type.sh $StartTime    147.239462    147.482804    "peop"
type.sh $StartTime    147.482804    147.738953    "le\S"
type.sh $StartTime    147.738953    147.995102    "who\S"
type.sh $StartTime    147.995102    148.392133    "are\n"
type.sh $StartTime    148.392133    148.727689    "still\S"
type.sh $StartTime    148.727689    148.999207    "a"
type.sh $StartTime    148.999207    149.981218    "live."
type.sh $StartTime    149.981218    150.748705    "\CPS:\S"
type.sh $StartTime    150.748705    151.007415    "And\S"
type.sh $StartTime    151.007415    151.245634    "be"
type.sh $StartTime    151.245634    151.465922    "lieve\S"
type.sh $StartTime    151.465922    151.778424    "me\S"
type.sh $StartTime    151.778424    151.991028    "I\S"
type.sh $StartTime    151.991028    152.357321    "am\n"
type.sh $StartTime    152.357321    152.751791    "still\S"
type.sh $StartTime    152.751791    152.992571    "al"
type.sh $StartTime    152.992571    153.448516    "ive.\n"
type.sh $StartTime    153.448516    154.496166    "PPS:\S"
type.sh $StartTime    154.496166    154.744631    "I'm\S"
type.sh $StartTime    154.744631    154.987972    "do"
type.sh $StartTime    154.987972    155.133977    "ing\S"
type.sh $StartTime    155.133977    155.531008    "Sci"
type.sh $StartTime    155.531008    155.75642    "ence\S"
type.sh $StartTime    155.75642    155.992077    "and\S"
type.sh $StartTime    155.992077    156.399354    "I'm\n"
type.sh $StartTime    156.399354    156.745155    "still\S"
type.sh $StartTime    156.745155    156.996181    "al"
type.sh $StartTime    156.996181    157.431635    "ive.\n"
type.sh $StartTime    157.431635    158.497215    "PPS:\S"
type.sh $StartTime    158.497215    158.748241    "I\S"
type.sh $StartTime    158.748241    158.965968    "feel\S"
type.sh $StartTime    158.965968    159.211871    "FAN"
type.sh $StartTime    159.211871    159.496196    "TAS"
type.sh $StartTime    159.496196    159.762591    "TIC\S"
type.sh $StartTime    159.762591    159.990564    "and\S"
type.sh $StartTime    159.990564    160.372226    "I'm\n"
type.sh $StartTime    160.372226    160.746204    "still\S"
type.sh $StartTime    160.746204    160.99723    "al"
type.sh $StartTime    160.99723    161.501844    "ive.\n"
type.sh $StartTime    161.501844    162.733921    "\nFINAL\STHOUGHT:\n"
type.sh $StartTime    162.733921    162.984947    "While\S"
type.sh $StartTime    162.984947    163.220604    "you're\S"
type.sh $StartTime    163.220604    163.492122    "dy"
type.sh $StartTime    163.492122    163.735464    "ing\S"
type.sh $StartTime    163.735464    163.999297    "I'll\S"
type.sh $StartTime    163.999297    164.327168    "be\n"
type.sh $StartTime    164.327168    164.747253    "still\S"
type.sh $StartTime    164.747253    165.003402    "al"
type.sh $StartTime    165.003402    165.520823    "ive.\n"
type.sh $StartTime    165.520823    166.489066    "\nFINAL\STHOUGHT\SPS:\n"
type.sh $StartTime    166.489066    166.750338    "And\S"
type.sh $StartTime    166.750338    166.996242    "when\S"
type.sh $StartTime    166.996242    167.231899    "you're\S"
type.sh $StartTime    167.231899    167.498294    "dead\S"
type.sh $StartTime    167.498294    167.74932    "I\S"
type.sh $StartTime    167.74932    167.992662    "will\S"
type.sh $StartTime    167.992662    168.289795    "be\n"
type.sh $StartTime    168.289795    168.755986    "still\S"
type.sh $StartTime    168.755986    168.989082    "al"
type.sh $StartTime    168.989082    169.442465    "ive.\n"
type.sh $StartTime    169.442465    170.236528    "\n\n"
type.sh $StartTime    170.236528    170.75651    "STILL\S"
type.sh $StartTime    170.75651    170.976798    "A"
type.sh $StartTime    170.976798    171.417375    "LIVE"
type.sh $StartTime    171.417375    172.354881    "\C"
type.sh $StartTime    172.354881    172.78265    "STILL\S"
type.sh $StartTime    172.78265    173.028553    "A"
type.sh $StartTime    173.028553    173.449918    "LIVE\n"
echo -n 'wheatley@GLaDOS:~$ '
sleep 5
clear

So over one weekend I wrote three programs totaling 455 lines to replace 7,360 lines of unfinished code. (Keep in mind I already had the lyric file and previous knowledge from past attempts. This is at least the third try.) I’d like to add the original ASCII art, if I can get some help merging the lyrics with the art. I’d also like to replace “StillAlive.sh” with a more generic program, so does anyone know how to read line $number from a text file in shell? Post your suggestions in the comment, please.

 |\_/|
 |0 0|__
 =-*-=__\
c_c__(___)

-from the game robotfindskitten, used without permission. According to the license, I don’t need it. You should read the license before using it yourself, though.

UPDATE: Same day!

I can now export audio from audacity, with lyrics, and put both into a generic program! Now I don’t need to rewrite it! And it’s only been a week! I’ve got to thank Bruce Barnett for creating a “sed tutorial”. Now all that’s left is writing the ASCII art “lyrics”, and writing the code to merge them! (Second one’s harder. First one will probably be done today.) The program “TypeLyrics.sh” now reads:

SongFile=$1
LyricFile=$2
clear
echo 'Please wait a few seconds. |\_/|'
echo 'Some errors will appear,   |0 0|__'
echo 'the screen will clear,     =-*-=__\'
echo 'and music will then play. c_c__(___)'
echo ''
StartTime=`date +'%s.%N'`
mplayer -msglevel all=-1 $SongFile &
TotalLines=`wc -l $LyricFile | sed 's/\([0-9]*\).*/\1/'`
for (( LineNum=1; LineNum <= TotalLines; LineNum++ ))
    do
        CurrentLine=`sed "$LineNum q;d" $LyricFile`
        type.sh $StartTime $CurrentLine
    done

“StillAlive.sh” now reads:

bin/TypeLyrics.sh ~/StillAlive.flac ~/Still_Alive_labels.txt

Much simpler! Now the line count is down to 97, and only one line needs to be changed per song!

About these ads

About nicknackgus

I have worked with all sorts of stuff. I built a computer from parts, installed some operating systems on it, and set up all sorts of software, and I don't have enough space here to mention any advanced settings in any area. I've also worked in science, multimedia, special effects, and robotics.
This entry was posted in Linux, Portal, Programs, Shell. Bookmark the permalink.

One Response to GLaDOS is “Still Alive”…in Shell!

  1. Gabriel says:

    Amazing. It’s very interesting! I am trying to integrate GLaDOS into my linux system. It would be fun to make my pc more interactive..

    There is project called “My Virtual Personal Assitant” by Corey Thomas. http://vimeo.com/30649822
    It’s great speech-text-command example. Unfortunately he’s using kinetics and windows only..

    Another app is “Siri for PC”. Well.. actually this is wolfram alpha database.

    I’ve tried and it works. At first.. And then again.. well.. not quiet.. I get error “sorry human, i found nothing” for anything I type in.

    It would be awesome instead of “beep, teep, quak, trin” R2D2 sounds hear GLaDOS “I don’t like you” or “Makes no sense what you are doing now”.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s