Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Hallo seventeen,
1. Du öffnest ein MS-DOS-Fenster (heißt auf Neudeutsch Windows-Eingabeaufforderung).
2. Du wechselst in das Verzeichnis, in dem Du das Skript abgelegt hast. Also z.B.
cd /d D:\Hier\ist\das\Skript
3. Du gibst ein:
eurosignal.py test.txt test.wav 100 0.6
4. Nach dem das Skript fertig ist, hast Du in dem Verzeichnis eine Datei "test.wav", die Du mit einem Player Deiner Wahl abspielen kannst.
Viel Spaß, Gerhard
1. Du öffnest ein MS-DOS-Fenster (heißt auf Neudeutsch Windows-Eingabeaufforderung).
2. Du wechselst in das Verzeichnis, in dem Du das Skript abgelegt hast. Also z.B.
cd /d D:\Hier\ist\das\Skript
3. Du gibst ein:
eurosignal.py test.txt test.wav 100 0.6
4. Nach dem das Skript fertig ist, hast Du in dem Verzeichnis eine Datei "test.wav", die Du mit einem Player Deiner Wahl abspielen kannst.
Viel Spaß, Gerhard
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Hallo Schwagalla,
Du kennst Dich dort besser aus als ich... in der RegTP-Datenbank sind in der Nähe eines Ortsteils von Schmallenberg, in dem es eine "Hunaustraße" gibt, jedenfalls zwei Funktürme verzeichnet, einer davon dürfte der Eurosignal-Standort gewesen sein.
Viele Grüße, Gerhard
Du kennst Dich dort besser aus als ich... in der RegTP-Datenbank sind in der Nähe eines Ortsteils von Schmallenberg, in dem es eine "Hunaustraße" gibt, jedenfalls zwei Funktürme verzeichnet, einer davon dürfte der Eurosignal-Standort gewesen sein.
Viele Grüße, Gerhard
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
@Schwagalla: Der Fernmeldeturm auf dem(?) Hunau (Grundnetzsender ZDF und WDR Fernsehen, DAB Kanal 12D) hat die genauen Koordinaten 8E22'42'', 51N12'26''. Gerundet wäre das dann eben 8E23, 51N12 - das Signal dürfte also wohl von diesem Turm gekommen sein.
Die anderen in NRW dürften auch eindeutig gewesen sein: Wesel-Büderich (Telekom-TV-Mast), Hagen=Goldberg (TV-Umsetzer ARD, ZDF, WDR), Siegen=Eisernhardt (Fernmeldeturm, DAB 12D) und Burscheid (TV-Mast, der demnächst aber kein TV mehr abstrahlt, dazu DAB 12D) - also alles Telekom-Standorte.
Die anderen in NRW dürften auch eindeutig gewesen sein: Wesel-Büderich (Telekom-TV-Mast), Hagen=Goldberg (TV-Umsetzer ARD, ZDF, WDR), Siegen=Eisernhardt (Fernmeldeturm, DAB 12D) und Burscheid (TV-Mast, der demnächst aber kein TV mehr abstrahlt, dazu DAB 12D) - also alles Telekom-Standorte.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Hmmm...
erstmal danke für die Hilfe, Gerhard. Jetzt habe ich es zumindest geschafft in das richtige
Verzeichnis zu kommen.
Also MSDOS-Eingabeauforderung aufgemacht cd C:\Python24\ eingegeben,
da dort die Datei eurosig.py rumliegt. Soweit alles okay. Denn vor dem Cursor steht nun "C:\Python24>".
Aber das Programm sagt nur "Befehl oder Dateiname nicht gefunden wenn "eurosig.py test.txt test.wav 100 0.6"
eingegeben wird.
erstmal danke für die Hilfe, Gerhard. Jetzt habe ich es zumindest geschafft in das richtige
Verzeichnis zu kommen.
Also MSDOS-Eingabeauforderung aufgemacht cd C:\Python24\ eingegeben,
da dort die Datei eurosig.py rumliegt. Soweit alles okay. Denn vor dem Cursor steht nun "C:\Python24>".
Aber das Programm sagt nur "Befehl oder Dateiname nicht gefunden wenn "eurosig.py test.txt test.wav 100 0.6"
eingegeben wird.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
@Gerhard:
Geil gemacht, super Arbeit ! Hatte heute zum ersten Mal die Gelegenheit, das Script zu testen... allerdings fällt mir auch die "fehlende Wiederholungssequenz" auf - beim Eurosignal gab es Werte, die mehrfach wiederholt wurden - das hat man akustisch auch deutlich gemerkt... gibt es eine Möglichkeit, das noch einzubauen ?! Klar, das System dahinter haben wir noch nicht raus (welche Zahlen wiederholt wurden) - aber das kann doch im Script sicher auch der Zufall regeln, oder ? ...hmmm... sicher sind das ein paar Zeichen, aber meine Versuche bisher sind gescheitert...
Geil gemacht, super Arbeit ! Hatte heute zum ersten Mal die Gelegenheit, das Script zu testen... allerdings fällt mir auch die "fehlende Wiederholungssequenz" auf - beim Eurosignal gab es Werte, die mehrfach wiederholt wurden - das hat man akustisch auch deutlich gemerkt... gibt es eine Möglichkeit, das noch einzubauen ?! Klar, das System dahinter haben wir noch nicht raus (welche Zahlen wiederholt wurden) - aber das kann doch im Script sicher auch der Zufall regeln, oder ? ...hmmm... sicher sind das ein paar Zeichen, aber meine Versuche bisher sind gescheitert...
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
[Beitrag auf Wunsch des Users entfernt.]
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
seventeen schrieb:
Ich würde nur noch ein "python" vor das ganze schreiben, dann sollte es eigentlich gehen.
Heiß, ganz heiß!Also MSDOS-Eingabeauforderung aufgemacht cd C:\Python24\ eingegeben, da dort die Datei eurosig.py rumliegt. Soweit alles okay. Denn vor dem Cursor steht nun "C:\Python24>". Aber das Programm sagt nur "Befehl oder Dateiname nicht gefunden wenn "eurosig.py test.txt test.wav 100 0.6" eingegeben wird.
Ich würde nur noch ein "python" vor das ganze schreiben, dann sollte es eigentlich gehen.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Hallo hybrid,
über das Phänomen der Wiederholungen habe ich auch schon nachgedacht. In dieser neuen Version des Skripts werden Nummern bis zu zweimal wiederholt, solange aufgrund niedriger Auslastung keine neuen Nummern generiert werden:
---8<------------8<------------8<---
#!/usr/bin/env python
# eurosig.py -- generates a random or predefined Eurosignal as WAV file
# Written Feb 2005 by Gerhard Grimm <gerhard dot grimm at gmx dot net>
# Donated to the Public Domain. Have fun!
import sys
from math import *
import struct
import random
class EurosignalEncoder:
"Converts a sequence of 6-digit numbers to a Eurosignal PCM waveform"
freq = [979.8, 903.1, 832.5, 767.4, 707.4, 652.0, 601.0, 554.0, 510.7, 470.8, 1062.9, 1153.1]
duration = 0.1
pause = [10, 11, 11, 11, 11, 11, 11, 11]
def __init__(self, Rate, Load, Limit, NumFile, WavFile):
"Initialize internal encoder state and set parameters"
self.rate = Rate # samples per second
self.load = Load # 0.0 .. 1.0
self.limit = Limit # how many numbers to produce
self.count = 0
self.numfile = NumFile # text file with numbers, read in player mode,
# written in random generator mode
self.wavfile = WavFile # WAV file (PCM), always written
self.phase = 0.0
self.lastnum = self.pause
self.lastcount = 0
def EncodeDigit(self, Digit):
"Encode a single digit to PCM. 10 = repetition, 11 = pause."
pcm = ''
samples = int(self.duration * self.rate)
omega = 2 * pi * self.freq[Digit]
for n in range(samples):
t = n / float(self.rate)
sample = 32000 * sin(omega * t + self.phase)
pcm += struct.pack('<h', sample)
endphase = samples / float(self.rate) * omega + self.phase
self.phase = fmod(endphase, 2 * pi)
return pcm
def DigitSequence(self, Number):
"Encode a number to a digit sequence, looking for repetitions."
if len(Number) < 6:
if self.lastcount == 3:
self.lastnum = self.pause
self.lastcount += 1
return self.lastnum
digits = []
for i in range(6):
digit = int(Number)
if (i > 0) and (digits[-1] == digit):
digit = 10
digits += [digit]
digits += [11, 11]
self.lastnum = digits
self.lastcount = 1
return digits
def WAVHeader(self):
"Provide the WAV header for the selected sample rate, 16 bit, mono."
return struct.pack('<4sL4s4sLHHLLHH4sL', 'RIFF', 36, 'WAVE', 'fmt ',
16, 1, 1, self.rate, 2 * self.rate, 2, 16,
'data', 0)
def NextNumber(self):
"Get the next number from input file or random generator."
if self.numfile.mode == 'r':
# Player mode
return self.numfile.readline()
# Random generator mode
self.count += 1
if self.count > self.limit:
return ''
result = ''
if random.random() < self.load:
for i in range(6):
result += chr(random.randint(48, 57))
result += '\n'
self.numfile.write(result)
return result
def DoGenerate(self):
"Perform the actual encoding."
self.wavfile.write(self.WAVHeader())
number = self.NextNumber()
while number:
for digit in self.DigitSequence(number):
self.wavfile.write(self.EncodeDigit(digit))
number = self.NextNumber()
# Adjust sizes in WAV header
size = self.wavfile.tell()
self.wavfile.seek(4)
self.wavfile.write(struct.pack('<L', size - 8))
self.wavfile.seek(40)
self.wavfile.write(struct.pack('<L', size - 44))
def Usage():
print 'Usage: eurosig.py <numbers file> <wav file>'
print '(to "play" an existing numbers file to a wav file)'
print 'or: eurosig.py <numbers file> <wav file> <# numbers> [<load>]'
print '(to generate a random sequence of numbers which will be logged'
print 'to a numbers file and "played" to a wav file -- load will be'
print 'assumed at 0.5 if not given)'
if __name__ == '__main__':
limit = 0
load = 0.5
if len(sys.argv) == 3:
# Player mode
num = open(sys.argv[1], 'r')
elif len(sys.argv) < 6:
# Random generator mode
num = open(sys.argv[1], 'w')
limit = int(sys.argv[3])
if len(sys.argv) == 5:
load = float(sys.argv[4])
else:
# wrong number of parameters
usage()
sys.exit(1)
wav = open(sys.argv[2], 'wb')
es = EurosignalEncoder(4000, load, limit, num, wav)
es.DoGenerate()
num.close()
wav.close()
---8<------------8<------------8<---
Da sich mehrere Stellen geändert haben, poste ich nochmal das komplette Skript. Der Wiederholungseffekt führt dazu, dass der "Load"-Parameter (letztes Argument) auf der Befehlszeile niedriger angegeben werden kann (z.B. 0.3), ohne dass zu lange Freizeichen-Perioden auftreten.
Viel Spaß damit!
Viele Grüße, Gerhard
über das Phänomen der Wiederholungen habe ich auch schon nachgedacht. In dieser neuen Version des Skripts werden Nummern bis zu zweimal wiederholt, solange aufgrund niedriger Auslastung keine neuen Nummern generiert werden:
---8<------------8<------------8<---
#!/usr/bin/env python
# eurosig.py -- generates a random or predefined Eurosignal as WAV file
# Written Feb 2005 by Gerhard Grimm <gerhard dot grimm at gmx dot net>
# Donated to the Public Domain. Have fun!
import sys
from math import *
import struct
import random
class EurosignalEncoder:
"Converts a sequence of 6-digit numbers to a Eurosignal PCM waveform"
freq = [979.8, 903.1, 832.5, 767.4, 707.4, 652.0, 601.0, 554.0, 510.7, 470.8, 1062.9, 1153.1]
duration = 0.1
pause = [10, 11, 11, 11, 11, 11, 11, 11]
def __init__(self, Rate, Load, Limit, NumFile, WavFile):
"Initialize internal encoder state and set parameters"
self.rate = Rate # samples per second
self.load = Load # 0.0 .. 1.0
self.limit = Limit # how many numbers to produce
self.count = 0
self.numfile = NumFile # text file with numbers, read in player mode,
# written in random generator mode
self.wavfile = WavFile # WAV file (PCM), always written
self.phase = 0.0
self.lastnum = self.pause
self.lastcount = 0
def EncodeDigit(self, Digit):
"Encode a single digit to PCM. 10 = repetition, 11 = pause."
pcm = ''
samples = int(self.duration * self.rate)
omega = 2 * pi * self.freq[Digit]
for n in range(samples):
t = n / float(self.rate)
sample = 32000 * sin(omega * t + self.phase)
pcm += struct.pack('<h', sample)
endphase = samples / float(self.rate) * omega + self.phase
self.phase = fmod(endphase, 2 * pi)
return pcm
def DigitSequence(self, Number):
"Encode a number to a digit sequence, looking for repetitions."
if len(Number) < 6:
if self.lastcount == 3:
self.lastnum = self.pause
self.lastcount += 1
return self.lastnum
digits = []
for i in range(6):
digit = int(Number)
if (i > 0) and (digits[-1] == digit):
digit = 10
digits += [digit]
digits += [11, 11]
self.lastnum = digits
self.lastcount = 1
return digits
def WAVHeader(self):
"Provide the WAV header for the selected sample rate, 16 bit, mono."
return struct.pack('<4sL4s4sLHHLLHH4sL', 'RIFF', 36, 'WAVE', 'fmt ',
16, 1, 1, self.rate, 2 * self.rate, 2, 16,
'data', 0)
def NextNumber(self):
"Get the next number from input file or random generator."
if self.numfile.mode == 'r':
# Player mode
return self.numfile.readline()
# Random generator mode
self.count += 1
if self.count > self.limit:
return ''
result = ''
if random.random() < self.load:
for i in range(6):
result += chr(random.randint(48, 57))
result += '\n'
self.numfile.write(result)
return result
def DoGenerate(self):
"Perform the actual encoding."
self.wavfile.write(self.WAVHeader())
number = self.NextNumber()
while number:
for digit in self.DigitSequence(number):
self.wavfile.write(self.EncodeDigit(digit))
number = self.NextNumber()
# Adjust sizes in WAV header
size = self.wavfile.tell()
self.wavfile.seek(4)
self.wavfile.write(struct.pack('<L', size - 8))
self.wavfile.seek(40)
self.wavfile.write(struct.pack('<L', size - 44))
def Usage():
print 'Usage: eurosig.py <numbers file> <wav file>'
print '(to "play" an existing numbers file to a wav file)'
print 'or: eurosig.py <numbers file> <wav file> <# numbers> [<load>]'
print '(to generate a random sequence of numbers which will be logged'
print 'to a numbers file and "played" to a wav file -- load will be'
print 'assumed at 0.5 if not given)'
if __name__ == '__main__':
limit = 0
load = 0.5
if len(sys.argv) == 3:
# Player mode
num = open(sys.argv[1], 'r')
elif len(sys.argv) < 6:
# Random generator mode
num = open(sys.argv[1], 'w')
limit = int(sys.argv[3])
if len(sys.argv) == 5:
load = float(sys.argv[4])
else:
# wrong number of parameters
usage()
sys.exit(1)
wav = open(sys.argv[2], 'wb')
es = EurosignalEncoder(4000, load, limit, num, wav)
es.DoGenerate()
num.close()
wav.close()
---8<------------8<------------8<---
Da sich mehrere Stellen geändert haben, poste ich nochmal das komplette Skript. Der Wiederholungseffekt führt dazu, dass der "Load"-Parameter (letztes Argument) auf der Befehlszeile niedriger angegeben werden kann (z.B. 0.3), ohne dass zu lange Freizeichen-Perioden auftreten.
Viel Spaß damit!
Viele Grüße, Gerhard
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Prima Das kommt dem Eurosignal-Effekt schon sehr nahe *g* So habe ich es in Erinnerung - allerdings habe ich den Wiederholungswert auf 3 gesetzt *g*
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Brubacker schrieb :
Auch nochmal Respekt an Gerhard für die Realisierung. Der Gedankengang "Mitschnitt gesucht - Eurosignal selbst programmiert" ist mal genial.
Super! Jetzt hat's geklappt. Ich war dann nachdem das Script fertig war zuerst verwirrt über den Sound, da Winamp und Co. das ganze zu schnell abspielten, aber Audacity hat's dann in richtiger Geschwindigkeit geschafft.Heiß, ganz heiß!
Ich würde nur noch ein "python" vor das ganze schreiben, dann sollte es eigentlich gehen.
Auch nochmal Respekt an Gerhard für die Realisierung. Der Gedankengang "Mitschnitt gesucht - Eurosignal selbst programmiert" ist mal genial.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
@Gerhard G.
habe gerade dein Python Script mittels vi in eine Datei geschrieben und mit chmod lauffähig gemacht.
-> Auf den ersten ENTER Druck fing die Festplatte kurz an zu rappeln, dann folgte wieder der bash-Promt. Python gehört eben zur Standardinstallation!
Jetzt noch mit XMMS gestartet...
Klasse dein Script!
habe gerade dein Python Script mittels vi in eine Datei geschrieben und mit chmod lauffähig gemacht.
-> Auf den ersten ENTER Druck fing die Festplatte kurz an zu rappeln, dann folgte wieder der bash-Promt. Python gehört eben zur Standardinstallation!
Jetzt noch mit XMMS gestartet...
Klasse dein Script!
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Hallo Drift,
genau deshalb habe ich das ganze mit Python gemacht, so hat jeder was davon. Viel Spaß!
Viele Grüße, Gerhard
genau deshalb habe ich das ganze mit Python gemacht, so hat jeder was davon. Viel Spaß!
Viele Grüße, Gerhard
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Nur zur Info: Inzw. ist das Skript übrigens auch bei den Downloads (Radio/DX->Downloads) samt einer kleinen Anleitung verlinkt worden.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
@Brubacker
Auf allen gängigen LINUX-Distributionen ist Python generell enthalten und gehört zur Standardinstallation.
Man muss es nicht erst aus dem Internet herunterladen !!
------------------------------------------------------------------------------
P.S. Es gibt sehr schöne Spiele, die komplett in Python geschrieben sind.
Auf allen gängigen LINUX-Distributionen ist Python generell enthalten und gehört zur Standardinstallation.
Man muss es nicht erst aus dem Internet herunterladen !!
------------------------------------------------------------------------------
P.S. Es gibt sehr schöne Spiele, die komplett in Python geschrieben sind.
Re: Für hartgesottene Eurosignal-Nostalgiker: Ein Python-Generatorskript
Moin,
ist es nicht so, dass der Raspberry durch Pingewackel direkt ein UKW-Signal erzeugen kann?
Ein Schelm, wer es denn nun mit diesem Script modulieren täte
ist es nicht so, dass der Raspberry durch Pingewackel direkt ein UKW-Signal erzeugen kann?
Ein Schelm, wer es denn nun mit diesem Script modulieren täte