This commit is contained in:
nicksmadscience 2020-11-27 11:45:24 -05:00
parent fedc678e60
commit 93766bb435
2 changed files with 0 additions and 481 deletions

View File

@ -1,226 +0,0 @@
# EAS SAME audio file generator!
# Written in a single sitting on a lazy Saturday.
# I thought this would take WAY more time than it did
# most of the development time was getting it to work with my SAGE EAS ENDEC
# (which is understandably very prone to sanity-checking)
# TODO: per development best practices, this should be class-ified
import numpy as np
from scipy.io import wavfile
# import random # used for testing gibberish data during early development
import sys # for stdout
import subprocess # to play the resulting wave file
import datetime # EAS alerts are heavily dependent on timestamps so this makes it easy to send a thing now
class easSAMEHeader:
def __init__(self, same_header_string):
self.same_header_string = same_header_string
self.fs = 43750
# get a blank 'samples' ready; this is where we'll build up the alert
samples = np.zeros(0)
def markBit():
f = 2083.33333
t = 1.0 / (520 + (5/6))
samples = np.arange(t * fs) / fs
roffle = np.sin(2 * np.pi * f * samples)
return roffle * 0.8
def spaceBit():
f = 1562.5
t = 1.0 / (520 + (5/6))
samples = np.arange(t * fs) / fs
return np.sin(2 * np.pi * f * samples)
signal = np.zeros(20000)
def byte(the_byte):
sys.stdout.write(the_byte)
sys.stdout.write(" ")
byte_data = np.zeros(0)
for i in range(0, 8):
if ord(the_byte) >> i & 1:
sys.stdout.write("1")
byte_data = np.append(byte_data, markBit())
else:
sys.stdout.write("0")
byte_data = np.append(byte_data, spaceBit())
sys.stdout.write("\n")
sys.stdout.flush()
return byte_data
def extramarks(numberOfMarks):
"""SAGE encoders seem to add a few mark bits at the beginning and end"""
byte_data = np.zeros(0)
for i in range(0, numberOfMarks):
byte_data = np.append(byte_data, markBit())
return byte_data
def preamble():
byte_data = np.zeros(0)
for i in range(0, 16):
byte_data = np.append(byte_data, markBit())
byte_data = np.append(byte_data, markBit())
byte_data = np.append(byte_data, spaceBit())
byte_data = np.append(byte_data, markBit())
byte_data = np.append(byte_data, spaceBit())
byte_data = np.append(byte_data, markBit())
byte_data = np.append(byte_data, spaceBit())
byte_data = np.append(byte_data, markBit())
# TODO: i could probably replace this with the bits() function
return byte_data
def generateSAMEAudio(code):
# SAME HEADER (3x)
for i in range(0, 3):
signal = np.append(signal, preamble())
# turn each character into a sequence of sine waves
for char in code:
signal = np.append(signal, byte(char))
signal = np.append(signal, np.zeros(43750)) # wait the requisite one second
# TODO: attention tone?
# TODO: audio message?
# EOM (3x)
for i in range(0, 3):
signal = np.append(signal, preamble())
for char in "NNNN": # NNNN = End Of Message
signal = np.append(signal, byte(char))
signal = np.append(signal, np.zeros(43750)) # wait the requisite one second
# signal *= -32767
signal = np.int16(signal)
wavfile.write(str("same.wav"), fs, signal)
# TODO: oh shit, I guess I need to think about multi-platform compatibility
def playLatestSAMEFIleOnMacOS():
subprocess.call("afplay same.wav", shell=True)
# EAS alerts are heavily dependent on timestamps so this makes it easy/fun to send a thing now
sameCompatibleTimestamp = datetime.datetime.now().strftime("%j%H%M")
# known good
code = "ZCZC-PEP-EAN-000000+0400-" + sameCompatibleTimestamp + "-SCIENCE -" # nuclear armageddon (or some other form of "we are all likely to die")
code = "ZCZC-PEP-EAT-000000+0400-" + sameCompatibleTimestamp + "-SCIENCE -" # nuclear armageddon (or some other form of "we are all likely to die")
# code = "ZCZC-PEP-EAT-000000+0400-2142350-SCIENCE -" # lol jk no nuclear armageddon
# code = "ZCZC-WXR-TOR-024031+0030-2150015-SCIENCE -" # tornado warning, silver spring, md
# code = "ZCZC-WXR-SVR-024031+0030-2142200-SCIENCE -" # severe thunderstorm warning, silver spring, md
# code = "ZCZC-WXR-EVI-024031+0030-2150010-SCIENCE -" # evacuation immediate!!, silver spring, md
# code = "ZCZC-WXR-FFW-024031+0030-2150021-SCIENCE -"
# code = "SUCK MY F**KING B***S YOU F**KING C*********RS" # does not seem to work :'(
def requestHandler_samecode(_get):
"""Generate and play back an EAS SAME header code based on _get"""
global clients
print urllib2.unquote(_get[2])
# TODO: implement same code
# for client in clients:
# client.write_message(json.dumps({"messagetype": "marquee", "message": urllib2.unquote(_get[2])}))
return "text/plain", str(_get[2])
httpRequests = {'': requestHandler_index,
'samecode': requestHandler_samecode,
}
#This class will handles any incoming request from
#the browser
class myHandler(BaseHTTPRequestHandler):
#Handler for the GET requests
def do_GET(self):
elements = self.path.split('/')
responseFound = False
for httpRequest, httpHandler in httpRequests.iteritems():
# print elements[1] + " == " + httpRequest
if elements[1] == httpRequest: # in other words, if the first part matches
contentType, response = httpHandler(elements)
responseFound = True
self.send_response(200)
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header('Content-type', contentType)
self.end_headers()
self.wfile.write(response)
if not responseFound:
contentType, response = requestHandler_index('/')
self.send_response(200)
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header('Content-type', contentType)
self.end_headers()
self.wfile.write(response)
return
def http():
server = HTTPServer(('', PORT_NUMBER), myHandler)
print 'Started httpserver on port ' , PORT_NUMBER
server.serve_forever()
httpThread = Thread(target=http)
httpThread.daemon = True
httpThread.start()

255
same.aup
View File

@ -1,255 +0,0 @@
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE project PUBLIC "-//audacityproject-1.3.0//DTD//EN" "http://audacity.sourceforge.net/xml/audacityproject-1.3.0.dtd" >
<project xmlns="http://audacity.sourceforge.net/xml/" projname="same_data" version="1.3.0" audacityversion="2.1.3" sel0="0.0000000000" sel1="4.8227308132" vpos="0" h="0.0000000000" zoom="22.8881835938" rate="43750.0" snapto="off" selectionformat="hh:mm:ss + milliseconds" frequencyformat="Hz" bandwidthformat="octaves">
<tags/>
<wavetrack name="same" channel="2" linked="0" mute="0" solo="0" height="150" minimized="0" isSelected="1" rate="43750" gain="1.0" pan="0.0">
<waveclip offset="22.09761067">
<sequence maxsamples="262144" sampleformat="262159" numsamples="0"/>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="28.38592651">
<sequence maxsamples="262144" sampleformat="262159" numsamples="140444">
<waveblock start="0">
<simpleblockfile filename="e0000f50.au" len="140444" min="-0.999969" max="0.999969" rms="0.335452"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="0.00000000">
<sequence maxsamples="262144" sampleformat="262159" numsamples="207612">
<waveblock start="0">
<simpleblockfile filename="e0000a44.au" len="207612" min="-0.999969" max="0.999969" rms="0.484135"/>
</waveblock>
</sequence>
<envelope numpoints="1">
<controlpoint t="4.745394285714" val="1.000000000000"/>
</envelope>
</waveclip>
<waveclip offset="4.74541714">
<sequence maxsamples="262144" sampleformat="262159" numsamples="422">
<waveblock start="0">
<simpleblockfile filename="e000071a.au" len="422" min="0.0" max="0.0" rms="0.0"/>
</waveblock>
</sequence>
<envelope numpoints="2">
<controlpoint t="0.000000000000" val="1.000000000000"/>
<controlpoint t="0.009622857143" val="1.000000000000"/>
</envelope>
</waveclip>
<waveclip offset="4.75506286">
<sequence maxsamples="262144" sampleformat="262159" numsamples="846">
<waveblock start="0">
<simpleblockfile filename="e000047a.au" len="846" min="0.0" max="0.0" rms="0.0"/>
</waveblock>
</sequence>
<envelope numpoints="2">
<controlpoint t="0.000000000000" val="1.000000000000"/>
<controlpoint t="0.019314285714" val="1.000000000000"/>
</envelope>
</waveclip>
<waveclip offset="4.77440000">
<sequence maxsamples="262144" sampleformat="262159" numsamples="2114">
<waveblock start="0">
<simpleblockfile filename="e0000436.au" len="2114" min="0.0" max="0.0" rms="0.0"/>
</waveblock>
</sequence>
<envelope numpoints="2">
<controlpoint t="0.000000000000" val="1.000000000000"/>
<controlpoint t="0.048297142857" val="1.000000000000"/>
</envelope>
</waveclip>
<waveclip offset="4.82272000">
<sequence maxsamples="262144" sampleformat="262159" numsamples="1">
<waveblock start="0">
<simpleblockfile filename="e0000731.au" len="1" min="0.0" max="0.0" rms="0.0"/>
</waveblock>
</sequence>
<envelope numpoints="1">
<controlpoint t="0.000000000000" val="1.000000000000"/>
</envelope>
</waveclip>
</wavetrack>
<wavetrack name="Audio Track" channel="2" linked="0" mute="1" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="1.0" pan="0.0"/>
<wavetrack name="Audio Track" channel="0" linked="1" mute="0" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="1.0" pan="0.0">
<waveclip offset="16.31237317">
<sequence maxsamples="262144" sampleformat="262159" numsamples="580397">
<waveblock start="0">
<simpleblockfile filename="e0000da6.au" len="159470" min="-0.785644" max="0.749013" rms="0.118007"/>
</waveblock>
<waveblock start="159470">
<simpleblockfile filename="e00006c9.au" len="262144" min="-0.959982" max="0.95018" rms="0.142635"/>
</waveblock>
<waveblock start="421614">
<simpleblockfile filename="e0000198.au" len="158783" min="-0.895251" max="0.809989" rms="0.170435"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
</wavetrack>
<wavetrack name="Audio Track" channel="1" linked="0" mute="0" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="1.0" pan="0.0">
<waveclip offset="16.31237317">
<sequence maxsamples="262144" sampleformat="262159" numsamples="580397">
<waveblock start="0">
<simpleblockfile filename="e00007a4.au" len="159470" min="-0.866183" max="0.840947" rms="0.117003"/>
</waveblock>
<waveblock start="159470">
<simpleblockfile filename="e0000b9b.au" len="262144" min="-0.889742" max="0.924911" rms="0.161067"/>
</waveblock>
<waveblock start="421614">
<simpleblockfile filename="e00000a9.au" len="158783" min="-0.85556" max="0.921429" rms="0.189104"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
</wavetrack>
<wavetrack name="Audio Track" channel="2" linked="0" mute="0" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="0.089125" pan="0.0">
<waveclip offset="11.11669333">
<sequence maxsamples="262144" sampleformat="262159" numsamples="43750">
<waveblock start="0">
<simpleblockfile filename="e000094a.au" len="43750" min="-0.5" max="0.5" rms="0.353553"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="12.34231357">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9646">
<waveblock start="0">
<simpleblockfile filename="e0000f8c.au" len="9646" min="-0.5" max="0.5" rms="0.353493"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="12.86757938">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9646">
<waveblock start="0">
<simpleblockfile filename="e0000f8c.au" len="9646" min="-0.5" max="0.5" rms="0.353493"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="13.19181754">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9646">
<waveblock start="0">
<simpleblockfile filename="e0000f8c.au" len="9646" min="-0.5" max="0.5" rms="0.353493"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="13.67169001">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9646">
<waveblock start="0">
<simpleblockfile filename="e0000f8c.au" len="9646" min="-0.5" max="0.5" rms="0.353493"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="5.59240533">
<sequence maxsamples="262144" sampleformat="262159" numsamples="218750">
<waveblock start="0">
<simpleblockfile filename="e0000275.au" len="218750" min="-1.0" max="1.0" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
</wavetrack>
<wavetrack name="Audio Track" channel="2" linked="0" mute="0" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="0.089125" pan="0.0">
<waveclip offset="11.42252800">
<sequence maxsamples="262144" sampleformat="262159" numsamples="43750">
<waveblock start="0">
<simpleblockfile filename="e0000012.au" len="43750" min="-0.5" max="0.5" rms="0.353553"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="12.64814823">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9362">
<waveblock start="0">
<simpleblockfile filename="e0000c5f.au" len="9362" min="-0.5" max="0.5" rms="0.353603"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="13.12802070">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9362">
<waveblock start="0">
<simpleblockfile filename="e0000c5f.au" len="9362" min="-0.5" max="0.5" rms="0.353603"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="13.64031578">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9362">
<waveblock start="0">
<simpleblockfile filename="e0000c5f.au" len="9362" min="-0.5" max="0.5" rms="0.353603"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="14.42497333">
<sequence maxsamples="262144" sampleformat="262159" numsamples="9362">
<waveblock start="0">
<simpleblockfile filename="e0000c5f.au" len="9362" min="-0.5" max="0.5" rms="0.353603"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="5.81085867">
<sequence maxsamples="262144" sampleformat="262159" numsamples="218750">
<waveblock start="0">
<simpleblockfile filename="e000048c.au" len="218750" min="-1.0" max="1.0" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
</wavetrack>
<wavetrack name="Audio Track" channel="2" linked="0" mute="1" solo="0" height="150" minimized="0" isSelected="0" rate="43750" gain="0.063096" pan="0.0">
<waveclip offset="9.15319467">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e00003ad.au" len="87500" min="-0.99996" max="0.99996" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="11.53958750">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e000072d.au" len="87500" min="-0.999998" max="0.999998" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="13.97785844">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e0000741.au" len="87500" min="-0.999921" max="0.999921" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="16.31237317">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e00005b1.au" len="87500" min="-0.999998" max="0.999998" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="18.59500979">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e00001e5.au" len="87500" min="-0.999998" max="0.999998" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
<waveclip offset="20.92952452">
<sequence maxsamples="262144" sampleformat="262159" numsamples="87500">
<waveblock start="0">
<simpleblockfile filename="e000046e.au" len="87500" min="-0.99996" max="0.99996" rms="0.707107"/>
</waveblock>
</sequence>
<envelope numpoints="0"/>
</waveclip>
</wavetrack>
</project>