Forum: PC Hard- und Software Wavedatei erzeugen


von neuer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich möchte eine Wave erstellen für den MPF-1 zum Laden von Daten.
Der Aufbau der Wav ist mir bekannt.
Meine Frage:
Müssen die Linien wie im Bild unten spitz sein oder können die wie oben 
(habe ich selber erstellt) rechteckig sein? um Daten zu übertragen.
Unten ist aus der originalen Datei der Daten.

Gruss

von Uhu U. (uhu)


Lesenswert?

Überleg mal scharf: WAV ist ein verlustfreies Audioformat.

Welchen Schluß kann man daraus für die damit aufzeichenbaren Signale 
ziehen?

von neuer (Gast)


Lesenswert?

Das kann ich jetzt nicht auf die Linienform schliessen,
bei welcher Form jetzt verluste auftreten?

Gruss

von Uhu U. (uhu)


Lesenswert?

Es treten keine Verluste auf - das ist der Sinn des Wortes 
verlustfrei.

von neuer (Gast)


Angehängte Dateien:

Lesenswert?

Tut mir leid, erkenn ich nicht.

Dies ist das Aufzeichnungformat für 1 Byte bei 165 bps.
Oben bei der 1. Frage sind ja auf dem Bild unten diese Spitzen.
Kann ich jetz Programmtechnisch diese Rechtecke zum Senden der Daten 
verwenden wie hier auf der Vorlage vom MPF-1?

Gruss

von Rolf Magnus (Gast)


Lesenswert?

neuer schrieb:

> Tut mir leid, erkenn ich nicht.

Ich erkenne auch keinen Zusammenhang zwischen deiner Frage und der 
Antwort.

> Dies ist das Aufzeichnungformat für 1 Byte bei 165 bps.
> Oben bei der 1. Frage sind ja auf dem Bild unten diese Spitzen.
> Kann ich jetz Programmtechnisch diese Rechtecke zum Senden der Daten
> verwenden wie hier auf der Vorlage vom MPF-1?

Ich würde sagen, ja. Die "Spitzen" sind wahrscheinlich auch nur durch 
einen begrenzten Frequenzgang verzerrte Rechtecke.

von neuer (Gast)


Lesenswert?

Jup, danke. Hört sich Präzise an.

Gruss

von Sebastian H. (sebihepp)


Lesenswert?

Verschicken kannst du beide Kurven. Aber höre dir mal nacheinander beide 
an. Du solltest einen (sehr geringen) Unterschied hören.

Was genau hast du vor? Vielleicht können wir dir helfen, wenn wir 
darüber bescheid wissen?

von neuer (Gast)


Angehängte Dateien:

Lesenswert?

Hexdaten für den MPF-1 umwandeln in eine Wav und dann per Band bzw über 
Pc übertragen zum MPF-1.

Da die Übertragung nicht sehr schnell ist, müsste man die anfertigen 
können.
Es sind 165 bps.

Hier sind die Übertragungsprotokolle.

Habe auch schon mit Purebasic einen Anfang gemacht mit 8000hz.

Gruss

von neuer (Gast)


Lesenswert?

Hier ist das Purebasicprogramm. Die Hexdatei ist 133byte gross.
Der Vergleich sieht schon gut aus.
1
Global *tonspeicher.l,tonlaenge.l,*datspeicher.l,datlaenge.l,adr_mem.l,wert.c,BytesPerSec.l
2
  Global adr_dat.l,uni.u,lo.c,hi.c,xx.l
3
  
4
  Declare bit_1()
5
  Declare bit_0()
6
  
7
  SetCurrentDirectory(GetPathPart(ProgramFilename()))
8
  
9
  InitSprite()
10
  InitSound()
11
 
12
  OpenWindow(0,0,0,800,600,"sound-test",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
13
  OpenWindowedScreen(WindowID(0),10,10,350,300,0,0,0)
14
  
15
  text1=TextGadget(#PB_Any, 10,380,90,20, "Taste-Q") 
16
  
17
  ClearScreen(RGB(128,128,128))
18
  
19
  OpenFile(0,"dice2.hex")
20
  datlaenge=Lof(0) 
21
  *datspeicher= AllocateMemory(datlaenge) 
22
  ReadData(0, *datspeicher, datlaenge)
23
  CloseFile(0)
24
                       
25
  #samplerate = 8000
26
  #bitrate = 16                      
27
  #channels = 1  
28
  #secs = 20
29
  
30
  #breite=1                                                                      
31
 
32
  BytesPerSec = #channels*#bitrate/8*#samplerate  
33
  
34
  tonlaenge=BytesPerSec*#secs+44
35
  *tonspeicher= AllocateMemory(tonlaenge) 
36
  
37
  Repeat
38
    
39
    Event.l = WaitWindowEvent(2)
40
  
41
    If GetAsyncKeyState_(#VK_Q)   
42
      PokeS(*tonspeicher,"RIFF")     
43
      PokeL(*tonspeicher+4,36+BytesPerSec*#secs)        
44
      PokeS(*tonspeicher+8,"WAVE")  
45
      PokeS(*tonspeicher+12,"fmt ")  
46
      PokeL(*tonspeicher+16,16) 
47
      PokeW(*tonspeicher+20,1) 
48
      PokeW(*tonspeicher+22,#channels)          
49
      PokeL(*tonspeicher+24,#samplerate )  
50
      PokeL(*tonspeicher+28,BytesPerSec) 
51
      PokeW(*tonspeicher+32,#bitrate/8*#channels) 
52
      PokeW(*tonspeicher+34,#bitrate) 
53
      PokeS(*tonspeicher+36,"data")   
54
      PokeL(*tonspeicher+40,BytesPerSec*#secs) 
55
      
56
      adr_mem=44
57
      adr_dat=0
58
       
59
      For stt=0 To 3999 ;4sec 1khz
60
        For xx=0 To #breite
61
          PokeW(*tonspeicher+adr_mem,-32000)
62
          adr_mem + 2
63
        Next
64
        For xx=0 To #breite
65
          PokeW(*tonspeicher+adr_mem,-32000)
66
          adr_mem + 2
67
        Next
68
        For xx=0 To #breite
69
          PokeW(*tonspeicher+adr_mem,32000)
70
          adr_mem + 2
71
        Next
72
        For xx=0 To #breite
73
          PokeW(*tonspeicher+adr_mem,32000)
74
          adr_mem + 2
75
        Next
76
      Next
77
      
78
      uni=1   ;filenummer 2byte
79
      lo=uni & $00ff
80
      hi=uni & $ff00/256
81
      For i=0 To 7
82
        If (lo & (1<<i))
83
          bit_1()
84
        Else
85
          bit_0()
86
        EndIf
87
      Next i
88
      For i=0 To 7
89
        If (hi & (1<<i))
90
          bit_1()
91
        Else
92
          bit_0()
93
        EndIf
94
      Next i
95
      
96
      uni=$1800   ;startadresse $1800 2byte
97
      lo=uni & $00ff
98
      hi=uni & $ff00/256
99
      For i=0 To 7
100
        If (lo & (1<<i))
101
          bit_1()
102
        Else
103
          bit_0()
104
        EndIf
105
      Next i
106
      For i=0 To 7
107
        If (hi & (1<<i))
108
          bit_1()
109
        Else
110
          bit_0()
111
        EndIf
112
      Next i
113
      
114
      uni=$1800+datlaenge  ;endadresse $1800+datlaenge 2byte
115
      lo=uni & $00ff
116
      hi=uni & $ff00/256
117
      For i=0 To 7
118
        If (lo & (1<<i))
119
          bit_1()
120
        Else
121
          bit_0()
122
        EndIf
123
      Next i
124
      For i=0 To 7
125
        If (hi & (1<<i))
126
          bit_1()
127
        Else
128
          bit_0()
129
        EndIf
130
      Next i
131
      
132
      wert=0  ;checksumme 1byte
133
      For i=0 To 7
134
        If (wert & (1<<i))
135
          bit_1()
136
        Else
137
          bit_0()
138
        EndIf
139
      Next i
140
      
141
      For stt=0 To 3999 ;2sec 2khz
142
        For xx=0 To #breite
143
          PokeW(*tonspeicher+adr_mem,-32000)
144
          adr_mem + 2
145
        Next
146
        For xx=0 To #breite
147
          PokeW(*tonspeicher+adr_mem,32000)
148
          adr_mem + 2
149
        Next
150
      Next
151
      
152
      For zz=0 To datlaenge-1 ;programmdaten
153
        wert = PeekB(*datspeicher+adr_dat)
154
        adr_dat +1
155
        
156
        For st=0 To 23 ;startbit 0
157
          For xx=0 To #breite
158
            PokeW(*tonspeicher+adr_mem,-32000)
159
            adr_mem + 2
160
          Next
161
        Next   
162
         
163
        For i=0 To 7 ;8bit daten
164
          If (wert & (1<<i))
165
            bit_1()
166
          Else
167
            bit_0()
168
          EndIf
169
        Next i
170
        
171
        For st=0 To 23 ;stopbit 1
172
          For xx=0 To #breite
173
            PokeW(*tonspeicher+adr_mem,32000)
174
            adr_mem + 2
175
          Next
176
        Next  
177
      Next
178
      
179
      For stt=0 To 3999 ;2sec 2khz
180
        For xx=0 To #breite
181
          PokeW(*tonspeicher+adr_mem,-32000)
182
          adr_mem + 2
183
        Next
184
        For xx=0 To #breite
185
          PokeW(*tonspeicher+adr_mem,32000)
186
          adr_mem + 2
187
        Next
188
      Next
189
     
190
      CreateFile(0, "wavtest.wav")  
191
      WriteData(0,*tonspeicher,tonlaenge)
192
      CloseFile(0)
193
      
194
      CatchSound(0, *tonspeicher)
195
      PlaySound(0)  
196
    EndIf
197
     
198
  Until Event = #PB_Event_CloseWindow   
199
200
End 
201
202
Procedure bit_0()
203
          For xx=0 To #breite
204
          PokeW(*tonspeicher+adr_mem,32000)
205
          adr_mem + 2
206
          Next
207
          For xx=0 To #breite
208
          PokeW(*tonspeicher+adr_mem,-32000)
209
          adr_mem + 2
210
          Next
211
          For xx=0 To #breite
212
          PokeW(*tonspeicher+adr_mem,32000)
213
          adr_mem + 2
214
          Next
215
          For xx=0 To #breite
216
          PokeW(*tonspeicher+adr_mem,-32000)
217
          adr_mem + 2
218
          Next
219
          For xx=0 To #breite
220
          PokeW(*tonspeicher+adr_mem,32000)
221
          adr_mem + 2
222
          Next
223
          For xx=0 To #breite
224
          PokeW(*tonspeicher+adr_mem,-32000)
225
          adr_mem + 2
226
          Next
227
          For xx=0 To #breite
228
          PokeW(*tonspeicher+adr_mem,32000)
229
          adr_mem + 2
230
          Next
231
          For xx=0 To #breite
232
          PokeW(*tonspeicher+adr_mem,-32000)
233
          adr_mem + 2
234
          Next
235
          For xx=0 To #breite
236
          PokeW(*tonspeicher+adr_mem,32000)
237
          adr_mem + 2
238
          Next
239
          For xx=0 To #breite
240
          PokeW(*tonspeicher+adr_mem,-32000)
241
          adr_mem + 2
242
          Next
243
          For xx=0 To #breite
244
          PokeW(*tonspeicher+adr_mem,32000)
245
          adr_mem + 2
246
          Next
247
          For xx=0 To #breite
248
          PokeW(*tonspeicher+adr_mem,-32000)
249
          adr_mem + 2
250
          Next
251
          For xx=0 To #breite
252
          PokeW(*tonspeicher+adr_mem,32000)
253
          adr_mem + 2
254
          Next
255
          For xx=0 To #breite
256
          PokeW(*tonspeicher+adr_mem,-32000)
257
          adr_mem + 2
258
          Next
259
          For xx=0 To #breite
260
          PokeW(*tonspeicher+adr_mem,32000)
261
          adr_mem + 2
262
          Next
263
          For xx=0 To #breite
264
          PokeW(*tonspeicher+adr_mem,-32000)
265
          adr_mem + 2
266
          Next
267
          For xx=0 To #breite
268
          PokeW(*tonspeicher+adr_mem,32000)
269
          adr_mem + 2
270
          Next
271
          For xx=0 To #breite
272
          PokeW(*tonspeicher+adr_mem,32000)
273
          adr_mem + 2
274
          Next
275
          For xx=0 To #breite
276
          PokeW(*tonspeicher+adr_mem,-32000)
277
          adr_mem + 2
278
          Next
279
          For xx=0 To #breite
280
          PokeW(*tonspeicher+adr_mem,-32000)
281
          adr_mem + 2
282
          Next
283
          For xx=0 To #breite
284
          PokeW(*tonspeicher+adr_mem,32000)
285
          adr_mem + 2
286
          Next
287
          For xx=0 To #breite
288
          PokeW(*tonspeicher+adr_mem,32000)
289
          adr_mem + 2
290
          Next
291
          For xx=0 To #breite
292
          PokeW(*tonspeicher+adr_mem,-32000)
293
          adr_mem + 2
294
          Next
295
          For xx=0 To #breite
296
          PokeW(*tonspeicher+adr_mem,-32000)
297
          adr_mem + 2
298
          Next
299
 EndProcedure  
300
       
301
 Procedure bit_1()
302
          For xx=0 To #breite
303
          PokeW(*tonspeicher+adr_mem,32000)
304
          adr_mem + 2
305
          Next
306
          For xx=0 To #breite
307
          PokeW(*tonspeicher+adr_mem,-32000)
308
          adr_mem + 2
309
          Next
310
          For xx=0 To #breite
311
          PokeW(*tonspeicher+adr_mem,32000)
312
          adr_mem + 2
313
          Next
314
          For xx=0 To #breite
315
          PokeW(*tonspeicher+adr_mem,-32000)
316
          adr_mem + 2
317
          Next
318
          For xx=0 To #breite
319
          PokeW(*tonspeicher+adr_mem,32000)
320
          adr_mem + 2
321
          Next
322
          For xx=0 To #breite
323
          PokeW(*tonspeicher+adr_mem,-32000)
324
          adr_mem + 2
325
          Next
326
          For xx=0 To #breite
327
          PokeW(*tonspeicher+adr_mem,32000)
328
          adr_mem + 2
329
          Next
330
          For xx=0 To #breite
331
          PokeW(*tonspeicher+adr_mem,-32000)
332
          adr_mem + 2
333
          Next
334
          For xx=0 To #breite
335
          PokeW(*tonspeicher+adr_mem,32000)
336
          adr_mem + 2
337
          Next
338
          For xx=0 To #breite
339
          PokeW(*tonspeicher+adr_mem,32000)
340
          adr_mem + 2
341
          Next
342
          For xx=0 To #breite
343
          PokeW(*tonspeicher+adr_mem,-32000)
344
          adr_mem + 2
345
          Next
346
          For xx=0 To #breite
347
          PokeW(*tonspeicher+adr_mem,-32000)
348
          adr_mem + 2
349
          Next
350
          For xx=0 To #breite
351
          PokeW(*tonspeicher+adr_mem,32000)
352
          adr_mem + 2
353
          Next
354
          For xx=0 To #breite
355
          PokeW(*tonspeicher+adr_mem,32000)
356
          adr_mem + 2
357
          Next
358
          For xx=0 To #breite
359
          PokeW(*tonspeicher+adr_mem,-32000)
360
          adr_mem + 2
361
          Next
362
          For xx=0 To #breite
363
          PokeW(*tonspeicher+adr_mem,-32000)
364
          adr_mem + 2
365
          Next
366
          For xx=0 To #breite
367
          PokeW(*tonspeicher+adr_mem,32000)
368
          adr_mem + 2
369
          Next
370
          For xx=0 To #breite
371
          PokeW(*tonspeicher+adr_mem,32000)
372
          adr_mem + 2
373
          Next
374
          For xx=0 To #breite
375
          PokeW(*tonspeicher+adr_mem,-32000)
376
          adr_mem + 2
377
          Next
378
          For xx=0 To #breite
379
          PokeW(*tonspeicher+adr_mem,-32000)
380
          adr_mem + 2
381
          Next
382
          For xx=0 To #breite
383
          PokeW(*tonspeicher+adr_mem,32000)
384
          adr_mem + 2
385
          Next
386
          For xx=0 To #breite
387
          PokeW(*tonspeicher+adr_mem,32000)
388
          adr_mem + 2
389
          Next
390
          For xx=0 To #breite
391
          PokeW(*tonspeicher+adr_mem,-32000)
392
          adr_mem + 2
393
          Next
394
          For xx=0 To #breite
395
          PokeW(*tonspeicher+adr_mem,-32000)
396
          adr_mem + 2
397
          Next
398
EndProcedure

von Sebastian H. (sebihepp)


Lesenswert?

Okay, also das Aussehen der Kurve ist egal. Das ist ja nur eine 
visualisierung der Tondaten.

Wenn dein MPF-1 die Wav-Datei empfangen und abspielen kann, sehe ich 
auch darin kein Problem.

Du liest einfach den Inhalt der Hex-Datei, wandelst in Wav um und 
schickst die Daten dann rüber. Danach kannst der MPF-1 sie abspielen. 
Informier dich nur im Vorraus darüber, welche Samplerate, Samplegröße, 
usw. der MPF-1 erwartet.

Wenn du während des Spielens die Daten übertragen möchtest, wird das 
dagegen nichts. Bei 165 Bit/Sekunde macht das etwa 20 Bytes/Sekunde und 
damit eine Samplerate von 10, wenn du 16 Bit Samplegröße benutzt. Du 
würdest nur noch ein mehr oder weniger schnelles Knacken hören.

von neuer (Gast)


Lesenswert?

Ich übertrage mit 8000hz, dementsprechend sind die Sound-Pokewerte.
Die Zeiten stimmen genau , wenn ich mit Audacity die Datei betrachtet.
Das heisst 1 bit in 6ms 10 bit 60ms usw.

Aber das Gerät nimmt nichts an.

Gruss

von Route_66 (Gast)


Lesenswert?

Hallo!
Diese Tonbandschnittstellen wurden früher an den Lautsprecherausgang 
eines Recorders angeschlossen. Der MPF-1 erwartet also Pegel im 
Voltbereich. Also wenn Deine Soundkarte diesae Pegel schafft, dann mal 
ordentlich "aufdrehen". Nach meiner Erfahrung wird aber meist ein 
Verstärker oder Trigger notwendig.
Rechtecksignal ist deshalb O.K.

von neuer (Gast)


Lesenswert?

Ich habe dafür einen Verstärker angeschlossen
Wenn ich die Demo-wav abspiele von der MPF-1-Seite, dann geht es ja.
Bloss die Demo-wav hat 44100hz.

Meine Abtastzeiten stimmen für 8000hz in ms.

Was ändert sich denn eigentlich bei 44100hz im Soundsystem?

Wenn ich da die Abtastzeiten prüfe im Audacity, habe ich auch 6ms pro 
bit auf der Anzeige, wie bei 8000hz, die ich in Purebasic herstelle.

Wenn ich jetz aber ein Programm aufnehme mit Audacity mit 8000hz vom 
MGF-1 dann kann ich diese Datei auch einwandfrei mit Audacity wieder 
fehlerfrei übertragen zum MPF-1. Also geht es auch mit 8000hz.

Gruss

von Route_66 (Gast)


Lesenswert?

Könnte es sein, daß das Startbit auch mit bit_0() und das Stopbit mit 
bit_1() codiert werden muß?

von Route_66 (Gast)


Lesenswert?

> Könnte es sein, daß das Startbit auch mit bit_0() und das Stopbit mit
> bit_1() codiert werden muß?

...zumindest geht das aus dem Assemblerlisting des MPF-1 so hervor!

Du machst das Startbit aber einfach nur die Bitzeit (6ms) ständig LOW 
und das Stopbit die Bitzeit ständig HIGH.

von neuer (Gast)


Lesenswert?

Hatte heute das Startbit(0) und Stopbit(1) gesetzt, ging auch 
nicht(siehe unten).
Werde es mal so umbauen, wie du gesagt hast.
Danke für den Vorschlag.
Das Listing oben stimmt nicht mehr.

...zumindest geht das aus dem Assemblerlisting des MPF-1 so hervor!

Spielst du auch mit so einem Ding?



1
uni=1   ;filenummer 2byte
2
      lo=uni & $00ff
3
      hi=uni & $ff00/256
4
      
5
      For st=0 To #stasto ;startbit 0
6
        For xx=0 To #breite
7
          PokeW(*tonspeicher+adr_mem,-32000)
8
          adr_mem + 2
9
        Next
10
      Next   
11
      For i=0 To 7
12
        If (lo & (1<<i))
13
          bit_1()
14
        Else
15
          bit_0()
16
        EndIf
17
      Next i
18
      For st=0 To #stasto ;stopbit 1
19
        For xx=0 To #breite
20
          PokeW(*tonspeicher+adr_mem,32000)
21
          adr_mem + 2
22
        Next
23
      Next  
24
      
25
      For st=0 To #stasto ;startbit 0
26
        For xx=0 To #breite
27
          PokeW(*tonspeicher+adr_mem,-32000)
28
          adr_mem + 2
29
        Next
30
      Next     
31
      For i=0 To 7
32
        If (hi & (1<<i))
33
          bit_1()
34
        Else
35
          bit_0()
36
        EndIf
37
      Next i
38
      For st=0 To #stasto ;stopbit 1
39
        For xx=0 To #breite
40
          PokeW(*tonspeicher+adr_mem,32000)
41
          adr_mem + 2
42
        Next
43
      Next

von Route_66 (Gast)


Lesenswert?

Du hast nicht ganz verstanden, wie ich es meinte!

Statt

>        For st=0 To 23 ;startbit 0
>          For xx=0 To #breite
>            PokeW(*tonspeicher+adr_mem,-32000)
>            adr_mem + 2
>          Next
>        Next

sollst Du nur

            bit_0()

schreiben und statt

>      For st=0 To 23 ;stopbit 1
>          For xx=0 To #breite
>           PokeW(*tonspeicher+adr_mem,32000)
>            adr_mem + 2
>          Next
>        Next
>      Next

nur

            bit_1()

und nicht mehr!

...und
> Spielst du auch mit so einem Ding?
nein aber ich stamme noch aus einer Generation, wo man gewohnt ist jedes 
Bit im Prozessor persönlich zu kennen.

Viel Erfolg

von neuer (Gast)


Lesenswert?

Jetzt wird schon die Startadresse angezeigt, nur bei den letzten Bytes 
kommt ein "ERR".
Dein Tip war richtig.

"22.02.2010 18:21 Bild oben", ich weiss nur nicht wie das ChkByte 
aussieht , habe jetzt erstmal "0" gesetzt.

Gruss

von Route_66 (Gast)


Lesenswert?

Hallo!

> ich weiss nur nicht wie das ChkByte
> aussieht , habe jetzt erstmal "0" gesetzt.

Hier der Link zum Assemblerlisting. Da kannst Du Dir das mal raussuchen.
VielleichIch finde ich auch etwas Zeit...

http://electrickery.xs4all.nl/comp/mfp1/doc/info.html

von Route_66 (Gast)


Lesenswert?

Hallo noch mal. Die Checksumme ist einfach die 8-Bit-Summe aller Bytes 
im Datenbereich, also zwischen den beiden 2kHz Tönen.

von neuer (Gast)


Lesenswert?

Das Checkbyte ist nur 1 Byte gross und ich kann über 256 byte in den 
Speicher schreiben. Wie soll da die Summe rein?

Siehe "22.02.2010 18:21 " oben das Bild vom gesamten Header.

Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Na, halt nur die unteren 8 Bit der Summe.

von neuer (Gast)


Lesenswert?

Also les ich das so:
Jedes Datenbyte addieren und von der Summe das untere Byte nehmen als 
Checkbyte?

Gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

So funktioniert eine 8-Bit-Prüfsumme.

von neuer (Gast)


Lesenswert?

Jup, danke.

jetzt läuft alles.

Kann jetzt mit dem Purebasic-Programm Binär-Bytes in Wav umwandeln und 
in den MPF-1 einladen.
Laufen alle fehlerfrei.

Gruss

von Guido (Gast)


Lesenswert?

Hi, kannst du das entgültige funktionierende Programm hier posten?
Wäre super :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.