Nocturne Broadcast Machine — Summary
Nocturne Broadcast Machine — Summary
What It Is
A terminal-based imaginary radio receiver that drifts between dead frequencies, surfacing signals, station IDs, and transmissions from the space between stations. Each broadcast is entropy-seeded from /dev/urandom — no network required.
How It Works
- Entropy source: Linux’s
/dev/urandom→ SHA-256 → random seed per signal - Signal generation: Each station has a name, callsign, frequency (kHz), modulation type (AM/FM/SSB/Chirp/etc.), language, location, and “years active” — all procedurally generated
- Transmission types: Music (with fictional song titles and artist names), Voice (fragment phrases), Numbers station (with letters + Morse), Morse, Drone, Choir, Tone, Static burst
- Signal metadata: strength meter, SNR meter, atmospheric conditions, location description, psychic phenomenon (25% chance)
- Display modes:
- Interactive (curses): Full TUI with tuning animation, signal cards, ASCII spectrum analyzer. Keyboard-driven: [Space] skip, [S] spectrum, [N] new scan, [Q] quit
- Text mode:
--textflag for non-interactive output (cron-friendly)
- Frequency drift: Subtle sine-wave drift across all displays to simulate analogue instability
Output
Each broadcast generates:
- Station name (e.g. “Voidwave”, “Dead Air Collective”, “Ghost Frequency”)
- Callsign (e.g. “VRG-7”, “XQR-2719”)
- Frequency + modulation + language
- Transmission kind + content (song, phrase, numbers, morse)
- Signal strength + SNR meters
- Atmospheric conditions
- Location + active-since date
- Psychic phenomenon flag (occasional)
- Station log tracking all encountered broadcasts
Run It
# Interactive (requires terminal)
python3 nocturne_broadcast.py
# Non-interactive (cron-safe)
python3 nocturne_broadcast.py --text
# Custom count
python3 nocturne_broadcast.py --text # default 5 signals
Files
nocturne_broadcast.py— main script (~700 lines, curses TUI + text fallback)summary.md— this file
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
"""
Nocturne Broadcast Machine
~~~~~~~~~~~~~~~~~~~~~~~~~~~
A terminal-based imaginary radio receiver that drifts between dead frequencies,
surfacing signals, station IDs, and transmissions from the space between stations.
Each broadcast is entropy-seeded via SHA-256 of /dev/urandom bytes.
No network required — all signals are procedurally generated.
"""
import curses
import hashlib
import os
import random
import time
import math
from dataclasses import dataclass
from typing import Optional
# ── Word Banks ──────────────────────────────────────────────────────────────
STATION_NAMES = [
"Voidwave", "Membrane Radio", "Subcarrier", "Liminal FM",
"Driftcast", "The Between", "Ghost Frequency", "Oscillation 7",
"Static Chapel", "Threshold广播", "Neon Loom", "Phosphor 88",
"Tessellator", "Aethermute", "Corridor Radio", "Residue FM",
"Infrasonic", "Half-signal", "The Undercast", "Phoneme 404",
"Meridian Drift", "Subrosa Radio", "Nocturne Machine", "Dead Air Collective",
"Pale Transmission", "Signal Soil", "Echoes from the Margin",
"The Unbecoming", "Frequency of Forgotten Names",
]
STATION_CALLSIGNS = [
"XQR-2719", "WRT-∅", "KRY-404", "NUL-9", "LVE-7",
"DRF-0", "AXS-13", "VNY-19", "ZER-0", "KSL-∅",
"FRQ-X", "TRN-71", "SIG-19", "NSE-X", "MLS-8",
"BCS-∅", "ENT-404", "NUL-19", "VRG-7", "DRT-13",
]
MODULATION_TYPES = [
"AM", "FM", "SSB", "CW", "DRM", "FM-Stereo",
"PWM", "PDM", "Spread Spectrum", "Chirp", "跳频",
]
CARRIER_TONES = [
530.0, 720.0, 810.0, 940.0, 1020.0, 1080.0,
1140.0, 1210.0, 1300.0, 1450.0, 1600.0, 1800.0,
]
LANGUAGES = ["EN", "DE", "JA", "ZH", "FR", "ES", "RU", "∅"]
BROADCAST_TYPES = [
"Music — unknown origin", "Voice — gender unknown", "Number station",
"Static burst", "Musical box melody", "Crowd murmur",
"Drone — sustained", "Saxophone — lone", "Hammond organ",
"Piano — through distortion", "Field recording", "Children's choir",
"弦楽四重奏", "Radio drama — fragment", "Saxophone — cold",
"Organ — from cathedral nowhere", "White noise with peaks",
"String quartet", "Synthesizer — detuned", "Radio art piece",
"Orchestral — fragment", "Choir — reverberant", "Jazz combo",
"Piano solo", "Ambient pad", "Percussion — sparse",
]
TRANSMISSION_TYPES = [
"Music", "Voice", "Numbers", "Morse", "Tone",
"Static", "Choir", "Drone", "Drama", "Field Recording",
]
LOCATION_TYPES = [
"Coastal village — population unknown",
"Mountain monastery — no longer occupied",
"Underground bunker — sealed",
"Broadcasting tower — defunct since",
"Radio telescope — listening only",
"Abandoned theatre — acoustics intact",
"Forest cabin — logs show no visitors",
"Silo turned studio — transmission active",
"Cargo ship — callsign unlisted",
"Apartment — old radio still plugged in",
"Time-delayed relay station",
"Hotel — room 613 — radio present",
"School — after hours",
"Sewing machine humming in background",
"Hospital — wing abandoned",
"Farmhouse — static persistent since",
"University — department dissolved",
"Prison — cell block C — radio found",
"Church — tower repurposed",
"Clock tower — still chiming",
]
PSYCHIC_PHENOMENA = [
"Sudden temperature drop in room",
"Lights dim momentarily",
" Listener reports feeling watched",
"Appliance flickers across the house",
"Cat stares at the radio",
"Picture frame falls — no wind",
"Clock in room stops",
"Radio warmth — physical heat",
"Transistor emits faint ozone",
"Interference matches speech rhythm",
"Neighbour's set turns on alone",
"Signal stronger at 3 AM",
"Reverberation too long for room size",
"Voice matches listener's cadence",
"Static arranges into syllables",
"Second voice underneath — same words",
"Radio plays after unplugged",
]
ATMOSPHERICS = [
"Heavy atmospherics — lightning possible",
"Signal riding heavy static",
"Moderate noise floor — readable",
"Clear night — excellent propagation",
"Auroral scatter — warping tones",
"Sporadic E skip — signals appearing",
"Ground wave — stable",
"Skywave — fading evident",
"Ducting event — unusual range",
"Interference from unknown source",
"Local thunderstorm — signal attenuating",
"Temperature inversion — ducting",
"Solar flare — propagation disturbed",
"Quiet night — very low noise floor",
"Slight tropospheric scatter",
"Sporadic — signals appearing at edges",
"Fading fast — rapid deep fades",
"Stable — no fading",
"Flutter — rapid amplitude variation",
]
SONG_TITLES = [
"Midnight in the Waiting Room",
"Signals from the Drowned Floor",
"The Cartographer's Last Broadcast",
"Oscillation 7",
"Static Lullaby",
"Tones Through Weathered Walls",
"Ghost Frequencies and Second Chances",
"The Machine That Dreamed of Radio",
"Night Frequencies",
"Broadcast from the Unmade Bed",
"Frequency of Forgotten Names",
"The Space Between Stations",
"Residue",
"Pale Transmission",
"The Dissolved City at 3 AM",
"Echoes from the Margin",
"Drift",
"Nocturne for Broken Receivers",
"What the Static Remembers",
"Under the Frequency of Rain",
"Lullaby for Dying Transistors",
"The Long Wave",
"Membrane",
"Signal Soil",
"Inheritance of Static",
"The Liminal Frequency",
"Radio Graveyard",
"Night Tide",
"Threshold",
"The Almost Signal",
"Ghost Gear",
"Murmur",
"The Unbecoming Broadcast",
"Phoneme 404",
"The Weight of Dead Air",
]
ARTIST_NAMES = [
"Unknown Ensemble", "Ensemble for Ghosts", "Signal/Soil",
"Liminal Radio Orchestra", "The Nocturne Machine",
"Pale Broadcast", "The Frequency of Forgotten Names",
"Voidwave Ensemble", "Dead Air Collective", "Echo Margin",
"Radio Graveyard Project", "Threshold",
"Inheritance", "Neon Loom", "The Dissolved",
"The Almost", "Corridor Radio", "Membrane",
"Aethermute", "Phosphor 88",
]
ARTIST_NAMES_JA = [
"幽霊放送", "、周波数の残響", "不明なアンサンブル",
"限界放送", "死んだ воздух",
]
NUMBER_STATION_LETTERS = [
"VCW", "KRY", "LVE", "AXS", "TRN", "FRQ",
"NUL", "ZER", "SIG", "DRT", "NSE", "MLS",
"VRG", "BCS", "ENT", "WRT", "XQR", "KSL",
]
# ── Entropy ─────────────────────────────────────────────────────────────────
def get_seed_bytes(n: int = 32) -> bytes:
return os.urandom(n)
def hash_entropy(seed_bytes: bytes, *args) -> int:
h = seed_bytes
for a in args:
h = hashlib.sha256(h + str(a).encode() + seed_bytes).digest()
return int.from_bytes(h[:8], "big")
def make_rng(seed_bytes: bytes, *args):
"""Create a random.Random from entropy + args."""
seed = hash_entropy(seed_bytes, *args)
r = random.Random()
r.seed(seed)
return r
# ── Data Classes ─────────────────────────────────────────────────────────────
@dataclass
class Station:
name: str
callsign: str
frequency: float
modulation: str
language: str
location: str
since: str
@dataclass
class Transmission:
kind: str
content: str
song_title: Optional[str] = None
artist: Optional[str] = None
letters: Optional[str] = None
morse: Optional[str] = None
@dataclass
class Signal:
station: Station
strength: float
snr: float
atmospherics: str
transmission: Transmission
phenomenon: Optional[str]
timestamp: str
# ── Signal Generation ─────────────────────────────────────────────────────────
def generate_station(rng: random.Random) -> Station:
name = rng.choice(STATION_NAMES)
callsign = rng.choice(STATION_CALLSIGNS)
carrier = rng.choice(CARRIER_TONES)
offset = rng.uniform(-5.0, 5.0)
frequency = round(carrier + offset, 1)
modulation = rng.choice(MODULATION_TYPES)
language = rng.choice(LANGUAGES)
location = rng.choice(LOCATION_TYPES)
years_ago = rng.randint(2, 67)
since = f"{years_ago} years ago"
return Station(name, callsign, frequency, modulation, language, location, since)
def generate_transmission(rng: random.Random, kind: str = None) -> Transmission:
if kind is None:
kind = rng.choice(TRANSMISSION_TYPES)
if kind == "Numbers":
letters = rng.choice(NUMBER_STATION_LETTERS)
nums = [str(rng.randint(0, 999)) for _ in range(rng.randint(3, 8))]
content = f"📡 Numbers station — {letters} {', '.join(nums)}"
numbers = f"{' '.join(nums)}"
morse = ''.join(rng.choice(['.', '-']) for _ in range(rng.randint(4, 20)))
return Transmission(kind, content, letters=numbers, morse=morse)
elif kind == "Music":
title = rng.choice(SONG_TITLES)
artist = rng.choice(ARTIST_NAMES)
return Transmission(kind, f"♪ {title} — {artist}", song_title=title, artist=artist)
elif kind == "Voice":
phrases = [
"…can you hear me…",
"…I have been waiting at this frequency…",
"…the broadcast was always intended for you…",
"…this is not a recording…",
"…the static has a shape and I know it…",
"…we are already inside the signal…",
"…tonight's program is your entire life…",
"…the dead are broadcasting and we are the dead…",
"…please leave your receiver on…",
"…we are transmitting from the margin…",
"…can you hear the space between words…",
"…the frequency is all that remains…",
"…I am the signal — you are the receiver…",
"…this station does not exist and yet…",
"…the broadcast continues despite us…",
"…we found a way through the static…",
"…the voice is mine — or was mine — or will be…",
"…you have been listening longer than you think…",
]
content = f"🎙 Voice transmission — \"{rng.choice(phrases)}\""
return Transmission(kind, content)
elif kind == "Morse":
words = ["QSA", "SK", "73", "QRZ", "U", "B", "AR", "BT"]
morse = ' '.join(rng.choice(['.'*rng.randint(1,3), '-'*rng.randint(1,3)]) + ' ' + ''.join(rng.choice(['.', '-']) for _ in range(rng.randint(2,6))) for _ in range(rng.randint(2,4)))
return Transmission(kind, f"📺 Morse code — {morse}", morse=morse)
elif kind == "Drone":
return Transmission(kind, "⟅ Sustained tone — drone — no modulation detected ⟆")
elif kind == "Choir":
return Transmission(kind, "🎼 Choir — distant — language unidentifiable — reverberant")
elif kind == "Tone":
freq = rng.randint(200, 3000)
return Transmission(kind, f"◈ Continuous tone — {freq} Hz — pure sine — origin unknown ◈")
elif kind == "Static":
patterns = [
"Burst — 0.4 seconds — shaped like language",
"Pulse train — 7 pulses — deliberate spacing",
"Popcorn noise — organic clustering",
"Impulse burst — short — repeating",
"Raspberry burst — rhythmic — 3-second loop",
]
return Transmission(kind, f"⚡ Static burst — {rng.choice(patterns)}")
else:
return Transmission(kind, rng.choice(BROADCAST_TYPES))
def generate_signal(seed_bytes: bytes, index: int) -> Signal:
rng = make_rng(seed_bytes, index)
station = generate_station(rng)
kind = rng.choice(TRANSMISSION_TYPES)
transmission = generate_transmission(rng, kind)
strength = rng.uniform(2.5, 5.0)
snr = rng.uniform(-10.0, 25.0)
atmospherics = rng.choice(ATMOSPHERICS)
phenomenon = rng.choice(PSYCHIC_PHENOMENA) if rng.random() < 0.25 else None
hour = rng.randint(0, 23)
minute = rng.randint(0, 59)
timestamp = f"{hour:02d}:{minute:02d}"
return Signal(station, strength, snr, atmospherics, transmission, phenomenon, timestamp)
# ── Display Helpers ──────────────────────────────────────────────────────────
def draw_divider(win, y, width, char="─"):
win.addstr(y, 0, char * width)
def meter_bar(win, y, x, width, value, max_val, label=""):
"""Draw an ASCII meter bar."""
filled = int((value / max_val) * width)
filled = min(filled, width)
bar = "█" * filled + "░" * (width - filled)
win.addstr(y, x, f"{label}{bar}")
def frequency_display(win, y, x, freq):
"""Display frequency with appropriate Unicode superscript."""
if freq == int(freq):
return f" {int(freq)} kHz "
return f" {freq:.1f} kHz "
# ── Curses Renderer ──────────────────────────────────────────────────────────
def render_signal(win, signal: Signal, width: int, focus: bool = False):
"""Render a single signal in a station card."""
s = signal.station
t = signal.transmission
win.clear()
win.box()
y = 1
# Header bar
focus_char = "◉" if focus else "○"
header = f" {focus_char} {s.name} "
win.addstr(y, 1, header, curses.A_BOLD)
win.addstr(y, width - 20, f"{s.callsign}", curses.A_DIM)
y += 1
draw_divider(win, y, width - 1, "─")
y += 1
# Frequency + modulation
freq_str = f"▼ {s.frequency:.1f} kHz [{s.modulation}] {s.language}"
win.addstr(y, 2, freq_str)
y += 1
# Strength + SNR meters
meter_bar(win, y, 2, 20, signal.strength, 5.0, "SIG ")
y += 1
meter_bar(win, y, 2, 20, max(signal.snr, 0), 30.0, "SNR ")
win.addstr(y, 24, f"{signal.snr:.1f} dB")
y += 2
draw_divider(win, y, width - 1, "─")
y += 1
# Transmission
t_label = f"[{t.kind}]"
win.addstr(y, 2, t_label, curses.A_BOLD | curses.color_pair(2))
y += 1
win.addstr(y, 2, t.content)
y += 1
if t.song_title:
win.addstr(y, 2, f" ♪ {t.song_title}", curses.A_DIM)
y += 1
if t.artist:
win.addstr(y, 2, f" ∷ {t.artist}", curses.A_DIM)
y += 1
if t.letters:
win.addstr(y, 2, f" Numbers: {t.letters}", curses.color_pair(3))
y += 1
if t.morse:
win.addstr(y, 2, f" Morse: {t.morse}", curses.A_DIM)
y += 1
y += 1
draw_divider(win, y, width - 1, "─")
y += 1
# Signal metadata
win.addstr(y, 2, f"◈ {signal.atmospherics}", curses.A_DIM)
y += 1
win.addstr(y, 2, f"◈ Location: {s.location} (active since {s.since})", curses.A_DIM)
y += 1
win.addstr(y, 2, f"◈ Logged: {signal.timestamp}", curses.A_DIM)
if signal.phenomenon:
y += 1
win.addstr(y, 2, f"⚠ {signal.phenomenon}", curses.color_pair(1) | curses.A_BOLD)
win.refresh()
return y + 1
def render_tuning_animation(win, target_freq, current_freq, width, height):
"""Draw tuning needle/sweep animation."""
win.clear()
win.box()
mid_y = height // 2
mid_x = width // 2
# Frequency display
freq_str = f"─── {current_freq:.1f} kHz ───"
win.addstr(mid_y - 3, max(0, mid_x - len(freq_str)//2), freq_str, curses.A_BOLD)
# Sweep indicator
sweep_chars = ["╱", "─", "╲", "|"]
for i, ch in enumerate(sweep_chars):
sx = (mid_x - 10 + i * 5) % (width - 4) + 2
win.addstr(mid_y, sx, ch, curses.A_DIM)
# Dial marks
dial = "0" + "─" * 20 + "+" + "─" * 20 + "0"
start_x = max(0, mid_x - len(dial)//2)
win.addstr(mid_y + 2, start_x, dial, curses.A_DIM)
# Needle
needle_pos = int(((current_freq - 500) / 1500) * (len(dial) - 1))
needle_pos = max(0, min(len(dial) - 1, needle_pos))
win.addstr(mid_y + 2, start_x + needle_pos, "▲", curses.A_BOLD | curses.color_pair(2))
# Target
target_str = f"SEARCHING… {target_freq:.1f} kHz"
win.addstr(mid_y + 4, max(0, mid_x - len(target_str)//2), target_str, curses.A_DIM)
win.refresh()
def render_spectrum(win, seed_bytes: bytes, width: int, height: int):
"""Draw a simple ASCII spectrum analyzer."""
win.clear()
win.box()
rng = make_rng(seed_bytes, "spectrum")
mid_y = height // 2
bands = min(width - 4, 40)
# Title
title = "〰 SPECTRUM 〰"
win.addstr(0, max(1, width // 2 - len(title)//2), title, curses.A_BOLD)
for col in range(1, width - 1):
# Random band height seeded per column
h = int(rng.uniform(0.1, 0.95) * (mid_y - 2))
for row in range(mid_y - h, mid_y + 1):
char = "▓" if row == mid_y - h else "░"
win.addstr(row, col, char)
# Baseline
win.addstr(mid_y, col, "─")
win.refresh()
def main(stdscr):
curses.curs_set(0)
curses.start_color()
curses.use_default_colors()
# Color pairs
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK) # Warning
curses.init_pair(2, curses.COLOR_CYAN, curses.COLOR_BLACK) # Transmission type
curses.init_pair(3, curses.COLOR_YELLOW, curses.COLOR_BLACK) # Numbers
curses.init_pair(4, curses.COLOR_GREEN, curses.COLOR_BLACK) # Good signal
curses.init_pair(5, curses.COLOR_MAGENTA, curses.COLOR_BLACK)# Drift
stdscr.nodelay(True)
stdscr.timeout(80)
# Layout
max_y, max_x = stdscr.getmaxyx()
HEADER_H = 5
SIGNAL_H = max_y - HEADER_H - 5
FOOTER_H = 4
header_win = curses.newwin(HEADER_H, max_x, 0, 0)
signal_win = curses.newwin(SIGNAL_H, max_x, HEADER_H, 0)
footer_win = curses.newwin(FOOTER_H, max_x, HEADER_H + SIGNAL_H, 0)
# State
seed_bytes = get_seed_bytes(32)
signals = [generate_signal(seed_bytes, i) for i in range(3)]
current_index = 0
current_freq = 540.0
target_freq = signals[current_index].station.frequency
tuning = True
tuning_timer = 0
broadcast_count = 0
session_start = time.time()
mode = "signal" # "signal", "spectrum", "tuning"
mode_timer = 0
drift_dir = 1.0
drift_accum = 0.0
tick = 0
# Precomputed stations log
all_stations_log = []
while True:
tick += 1
key = stdscr.getch()
if key in (curses.KEY_EXIT, 27, ord('q'), ord('Q')):
break
# Auto-cycle every ~15 seconds
mode_timer += 1
if mode_timer > 180: # ~15 seconds at 80ms ticks
mode_timer = 0
mode = random.choice(["signal", "spectrum", "signal"])
seed_bytes = get_seed_bytes(32)
# Drift frequency slowly
drift_accum += 0.008 * drift_dir
if abs(drift_accum) > 0.4:
drift_dir *= -1.0
current_freq += drift_accum
current_freq = max(500.0, min(2000.0, current_freq))
if tuning:
tuning_timer += 1
# Move toward target frequency
diff = target_freq - current_freq
current_freq += diff * 0.06
if abs(diff) < 0.3:
tuning = False
tuning_timer = 0
seed_bytes = get_seed_bytes(32)
signals = [generate_signal(seed_bytes, i) for i in range(3)]
for s in signals:
all_stations_log.append(f"[{s.timestamp}] {s.station.callsign} @ {s.station.frequency:.1f} kHz — {s.transmission.kind}")
broadcast_count += 1
render_tuning_animation(
signal_win, target_freq, current_freq, max_x, SIGNAL_H
)
else:
# Update display
signal = signals[current_index]
# ── Header ──
header_win.clear()
header_win.box()
title = "✦ NOCTURNE BROADCAST MACHINE ✦"
header_win.addstr(1, max(1, max_x//2 - len(title)//2), title, curses.A_BOLD)
header_win.addstr(2, 3, f"Frequency: {current_freq:.1f} kHz | Station: {signal.station.callsign} | Signal: {signal.strength:.1f}/5 | Broadcast #{broadcast_count} | [Q]uit [Space] skip [S]pectrum [N] new scan")
header_win.refresh()
# ── Signal window ──
if mode == "spectrum":
render_spectrum(signal_win, seed_bytes, max_x, SIGNAL_H)
else:
render_signal(signal_win, signal, max_x, focus=True)
# ── Footer ──
footer_win.clear()
footer_win.box()
running = int(time.time() - session_start)
mins, secs = running // 60, running % 60
footer_win.addstr(1, 3, f"✦ Drift: {drift_accum:+.3f} | {len(all_stations_log)} stations logged | Session: {mins:02d}:{secs:02d} | Theme: Dead Air ✦")
footer_win.refresh()
# Auto-advance signal every ~8 seconds
if tick % 100 == 0:
current_index = (current_index + 1) % len(signals)
if current_index == 0 and not tuning:
# Full retune
tuning = True
target_freq = signals[0].station.frequency
seed_bytes = get_seed_bytes(32)
signals = [generate_signal(seed_bytes, i) for i in range(3)]
broadcast_count += 1
for s in signals:
all_stations_log.append(f"[{s.timestamp}] {s.station.callsign} @ {s.station.frequency:.1f} kHz — {s.transmission.kind}")
# Keyboard actions (non-blocking)
if key == ord(' ') or key == curses.KEY_RIGHT:
# Next signal
current_index = (current_index + 1) % len(signals)
if not tuning:
tuning = True
target_freq = signals[current_index].station.frequency
seed_bytes = get_seed_bytes(32)
signals = [generate_signal(seed_bytes, i) for i in range(3)]
elif key == curses.KEY_LEFT:
current_index = (current_index - 1) % len(signals)
elif key == ord('s') or key == ord('S'):
mode = "spectrum" if mode == "signal" else "signal"
mode_timer = 0
elif key == ord('n') or key == ord('N'):
tuning = True
seed_bytes = get_seed_bytes(32)
signals = [generate_signal(seed_bytes, i) for i in range(3)]
target_freq = signals[0].station.frequency
# Print final log to stdout
print("\n─── NOCTURNE BROADCAST MACHINE ───")
print(f"Session: {broadcast_count} broadcasts, {len(all_stations_log)} stations")
print("\nStation Log:")
for entry in all_stations_log[-20:]:
print(f" {entry}")
print("\nGoodnight, listener.\n")
def text_mode(seed_bytes: bytes, count: int = 5):
"""Non-interactive text output — works without a TTY."""
print()
print("╔══════════════════════════════════════════════════════════════╗")
print("║ NOCTURNE BROADCAST MACHINE -- Text Mode ║")
print("╚══════════════════════════════════════════════════════════════╝")
print()
signals = [generate_signal(seed_bytes, i) for i in range(count)]
all_stations_log = []
for idx, sig in enumerate(signals):
s = sig.station
t = sig.transmission
all_stations_log.append(
f"[{sig.timestamp}] {s.callsign} @ {s.frequency:.1f} kHz -- {t.kind}"
)
for idx, sig in enumerate(signals):
s = sig.station
t = sig.transmission
print(f" {'─' * 56}")
print(f" ◉ {s.name} [{s.callsign}]")
print(f" {'─' * 56}")
print(f" Freq : {s.frequency:.1f} kHz [{s.modulation}] {s.language}")
print(f" Signal: {sig.strength:.1f}/5 | SNR: {sig.snr:.1f} dB")
print(f" {sig.atmospherics}")
print()
print(f" [{t.kind}] {t.content}")
if t.song_title:
print(f" ♪ {t.song_title} -- {t.artist}")
if t.letters:
print(f" Numbers: {t.letters}")
if t.morse:
print(f" Morse : {t.morse}")
print()
print(f" Location : {s.location}")
print(f" Active : since {s.since}")
print(f" Logged : {sig.timestamp}")
if sig.phenomenon:
print(f" ! {sig.phenomenon}")
print()
print(f" Station Log ({len(all_stations_log)} entries):")
for entry in all_stations_log:
print(f" {entry}")
print()
print(" Goodnight, listener.")
print()
if __name__ == "__main__":
import sys
if len(sys.argv) > 1 and sys.argv[1] == "--text":
seed_bytes = get_seed_bytes(32)
text_mode(seed_bytes, count=5)
else:
try:
curses.wrapper(main)
except curses.error:
print("[No TTY detected — run with --text for non-interactive output]")
seed_bytes = get_seed_bytes(32)
text_mode(seed_bytes, count=5)
Run output
=lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 585.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0─▲──────────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 628.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0──▲─────────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 669.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0───▲────────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 707.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────▲───────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 743.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────▲──────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 776.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────▲─────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 808.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────▲────────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 837.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────▲───────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 865.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────▲──────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 892.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────▲──────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 916.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────▲─────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 940.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────▲────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 961.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────▲────────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 982.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────▲───────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1001.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────▲──────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1019.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────▲──────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1037.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────▲─────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1053.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────▲─────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1068.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────▲─────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1082.4 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────▲────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1095.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────▲────+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1108.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────▲───+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1120.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────▲───+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1131.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────▲───+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1141.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────▲───+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1151.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────────▲──+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1160.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────────▲──+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1169.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────────▲──+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1177.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0─────────────────▲──+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1185.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────────▲─+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1192.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────────▲─+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1199.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────────▲─+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1206.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────────▲─+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1212.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0──────────────────▲─+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1217.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1223.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1228.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1232.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1237.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1241.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1245.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1249.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0───────────────────▲+────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1252.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1256.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1259.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1262.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1264.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1267.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1270.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1272.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1274.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1276.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1278.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1280.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1281.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1283.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1284.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────▲────────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1286.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1287.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1288.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1289.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1290.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1291.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1292.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1293.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1294.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1295.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1295.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1296.5 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1297.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1297.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1298.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1298.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1299.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1299.4 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1299.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1300.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1300.4 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1300.7 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.0 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.4 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.6 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.8 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1301.9 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1302.1 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1302.2 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1302.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkx✦ NOCTURNE BROADCAST MACHINE ✦xx Frequency: 1302.4 kHz | Station: ZER-0 | Signal: 2.7/5 | Broadcast #1
| [Q]uit [Space] skip [S]pectrum [N] new scanxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjlqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxxxxxxx─── 1302.3 kHz ───xxxxxx╱ ─ ╲ |xxxx0────────────────────+▲───────────────────0xxxxSEARCHING… 1302.5 kHzxxxmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj>
>[No TTY detected — run with --text for non-interactive output]
╔══════════════════════════════════════════════════════════════╗
║ NOCTURNE BROADCAST MACHINE -- Text Mode ║
╚══════════════════════════════════════════════════════════════╝
────────────────────────────────────────────────────────
◉ Subrosa Radio [AXS-13]
────────────────────────────────────────────────────────
Freq : 1019.1 kHz [FM-Stereo] ZH
Signal: 2.6/5 | SNR: 0.8 dB
Flutter — rapid amplitude variation
[Morse] 📺 Morse code — . -.-... -- ..-.- . --- ... ---
Morse : . -.-... -- ..-.- . --- ... ---
Location : Coastal village — population unknown
Active : since 8 years ago
Logged : 18:05
! Second voice underneath — same words
────────────────────────────────────────────────────────
◉ The Between [KSL-∅]
────────────────────────────────────────────────────────
Freq : 1602.3 kHz [FM-Stereo] ∅
Signal: 3.5/5 | SNR: 0.2 dB
Slight tropospheric scatter
[Field Recording] Saxophone — lone
Location : Hospital — wing abandoned
Active : since 40 years ago
Logged : 22:46
────────────────────────────────────────────────────────
◉ Corridor Radio [BCS-∅]
────────────────────────────────────────────────────────
Freq : 1454.1 kHz [SSB] DE
Signal: 2.8/5 | SNR: -6.0 dB
Moderate noise floor — readable
[Numbers] 📡 Numbers station — NUL 876, 495, 420, 206
Numbers: 876 495 420 206
Morse : ---.---.---
Location : Sewing machine humming in background
Active : since 30 years ago
Logged : 12:51
────────────────────────────────────────────────────────
◉ Nocturne Machine [LVE-7]
────────────────────────────────────────────────────────
Freq : 1296.3 kHz [AM] RU
Signal: 3.5/5 | SNR: 24.2 dB
Sporadic — signals appearing at edges
[Choir] 🎼 Choir — distant — language unidentifiable — reverberant
Location : Farmhouse — static persistent since
Active : since 7 years ago
Logged : 13:50
────────────────────────────────────────────────────────
◉ Echoes from the Margin [DRT-13]
────────────────────────────────────────────────────────
Freq : 938.3 kHz [PWM] ∅
Signal: 3.9/5 | SNR: -4.3 dB
Skywave — fading evident
[Voice] 🎙 Voice transmission — "…the broadcast was always intended for you…"
Location : Mountain monastery — no longer occupied
Active : since 2 years ago
Logged : 08:45
! Clock in room stops
Station Log (5 entries):
[18:05] AXS-13 @ 1019.1 kHz -- Morse
[22:46] KSL-∅ @ 1602.3 kHz -- Field Recording
[12:51] BCS-∅ @ 1454.1 kHz -- Numbers
[13:50] LVE-7 @ 1296.3 kHz -- Choir
[08:45] DRT-13 @ 938.3 kHz -- Voice
Goodnight, listener.