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
Überleg mal scharf: WAV ist ein verlustfreies Audioformat. Welchen Schluß kann man daraus für die damit aufzeichenbaren Signale ziehen?
Das kann ich jetzt nicht auf die Linienform schliessen, bei welcher Form jetzt verluste auftreten? Gruss
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
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.
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?
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
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 |
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.
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
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.
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
Könnte es sein, daß das Startbit auch mit bit_0() und das Stopbit mit bit_1() codiert werden muß?
> 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.
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 |
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
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
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
Hallo noch mal. Die Checksumme ist einfach die 8-Bit-Summe aller Bytes im Datenbereich, also zwischen den beiden 2kHz Tönen.
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
Also les ich das so: Jedes Datenbyte addieren und von der Summe das untere Byte nehmen als Checkbyte? Gruss
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.