← ST-Computer 07 / 1992

It’s Reality!

Programmierpraxis

Die meisten modernen Kassettendecks und Bandmaschinen sind mit EchtzeitzĂ€hlwerken ausgestattet; besonders teure GerĂ€te können sogar mit einer Restspielzeitanzeige aufwarten. Diese Features machen sich besonders im Aufnahmebetrieb enorm nĂŒtzlich.

FĂŒr die Besitzer weniger gut ausgestatteter Maschinen bringt das hier im Rahmen des Programms REALTIME vorgestellte Verfahren zur Umrechnung von ZĂ€hler stĂ€nden in Echtzeit Abhilfe. Voraussetzung ist lediglich, daß das vorhandene ZĂ€hlwerk prĂ€zise arbeitet.

Das Scenario

Der geknechtete Anwender eines Ă€lteren oder preiswerteren GerĂ€tes, welcher sich des öfteren seine eigenen Konserven fĂŒr bestimmte Zwecke (z.B. Autoradio, Walkman, Diashow) zusammenstellt, stolpert mangels Echtzeitanzeige bzw. Restspielzeitbestimmung regelmĂ€ĂŸig ĂŒber zwei Probleme: Entweder die regulĂ€re BandlĂ€nge reicht nicht fĂŒr die Aufnahme, oder das Band ist lĂ€nger als angegeben, wodurch ein lĂ€ngeres StĂŒck am Bandende unbespielt bzw. ungenutzt bleibt; letzteres ist besonders im Auto-Reverse-Betrieb lĂ€stig.

Solchermaßen geartete Ärgernisse lassen sich nur vermeiden, wenn man vor der Zusammenstellung des aufzunehmenden Materials genau weiß, wieviel Spielzeit noch zur VerfĂŒgung steht.

Das Problem

Die meisten einfachen ZĂ€hlwerke, egal ob mechanisch oder elektronisch realisiert, sind direkt an die Achse gekoppelt, die den aufwickelnden Wickelteller antreibt, und bilden somit die Anzahl der Umdrehungen desselben ab. Da sich, um die Bandgeschwindigkeit beim Abspielen oder Aufnehmen konstant zu halten, die Drehzahl des Wickeltellers stĂ€ndig verringern muß, verringert sich auch die Geschwindigkeit des ZĂ€hlers stĂ€ndig. Das heißt, der ZĂ€hlerstand ist nicht proportional zur abgelaufenen Zeit bzw. zur LĂ€nge des abgelaufenen Bandes; der ZĂ€hler arbeitet also nichtlinear. Dadurch wird das oft probierte einfache Umrechnen von ZĂ€hlerstand in Echtzeit ĂŒber Multiplikation mit einem konstanten Faktor vereitelt.

Der Lösungsansatz ...

... ist relativ simpel: Die dem ZĂ€hlerstand entsprechende Echtzeit ergibt sich, indem man die LĂ€nge des in dieser Zeit abgelaufenen Bandes durch die Bandgeschwindigkeit teilt. Zur Berechnung der LĂ€nge des abgelaufenen Bandes muß man sich vorstellen, daß mit jeder Umdrehung ein BandstĂŒck aufgewickelt wird, dessen LĂ€nge mit der Kreisumfangsformel bestimmt werden kann. Die GesamtlĂ€nge erhĂ€lt man also, indem man von einem leeren Wickelteller ausgehend, die LĂ€ngen aller gewickelten BandstĂŒcke aufsummiert, wobei man sich vor Augen halten muß, daß sich der Radius des gesamten Bandwickels mit jeder Umdrehung um die BandstĂ€rke vergrĂ¶ĂŸert.

Da man bei der Berechnung nur von einem leeren Wickelteller ausgehen kann, ist es notwendig, daß der ZĂ€hlerstand relativ zum Bandbeginn angegeben wird, d.h. das Band muß zunĂ€chst immer zurĂŒckgespult und der ZĂ€hler auf Null gesetzt werden.

Komplizierend kommt noch hinzu, daß bei den meisten GerĂ€ten das Laufwerk-ZĂ€hler-ÜbersetzungsverhĂ€ltnis nicht 1:1 ist, daß also der ZĂ€hlerstand nur ein Zerrbild der Anzahl der erfolgten Umdrehungen des Wickeltellers ist. Das bedeutet praktisch, daß vor der Bestimmung der Echtzeit der ZĂ€hlerstand mit einem fĂŒr jeden GerĂ€tetyp spezifischen Faktor: Anzahl der Umdrehungen/ZĂ€hlereinheit multipliziert werden muß. In der Abbildung finden Sie einen den obigen Überlegungen folgenden mathematischen Ansatz und die Herleitung der im Programm verwendeten Formel.

# Umrechnung von ZÀhlerstÀnden in Echtzeit

Legende:

c.... counter = ZĂ€hlerstand (relativ zum Bandbeginn!)
t......time = entsprechende Echtzeit (in sec)
nrpcu ... number of rotations /counter unit = Anzahl der Umdrehungen / ZĂ€hlereinheit
nr....number of rotations = Anzahl der Umdrehungen bzw. Wicklungen
tv.....tape speed = Bandgeschwindigkeit (in cm/s)
td.....tape diameter = BandstÀrke in cm
twd....tape winder diameter = Wickelkerndurchmesser (in cm)

Mathematischer Ansatz und Herleitung der Formel

Die EinflußgrĂ¶ĂŸen

Zur Umrechnung eines ZĂ€hlerstandes in Echtzeit mĂŒssen also Wickelkerndurchmesser, BandstĂ€rke, Bandgeschwindigkeit und das Laufwerk-ZĂ€hler-ÜbersetzungsverhĂ€ltnis bekannt sein.

Der Wickelkerndurchmesser ist fĂŒr normale Audio-Kassetten auf 2,2 cm genormt, die Bandgeschwindigkeit auf 4,75 cm/s; manche GerĂ€te arbeiten jedoch mit 4,76 oder 4,8 cm/ s (s. technische Unterlagen zum GerĂ€t). Die BandstĂ€rke ist abhĂ€ngig von Typ und LĂ€nge des verwendeten Bandes, liegt zwischen einem und zwei Hundertstel Millimeter und wird vom Hersteller meistens nicht veröffentlicht. Das ÜbersetzungsverhĂ€ltnis ist, wie schon erwĂ€hnt, in keiner Weise genormt; so findet man z.B. 1:1,2:1, 1:2, 1:3.5, 1:4.

Wollen Sie die vorliegende Formel anwenden, mĂŒssen Sie zuerst das ÜbersetzungsverhĂ€ltnis Ihres GerĂ€tes ermitteln. Bei gewöhnlichen Kassettendecks bietet sich folgende Vorgangsweise an: Nehmen Sie eine Kassette und markieren Sie einen beliebigen Zahn eines Zahnkranzes eines beliebigen Wickelkerns und legen Sie die Kassette so ein, daß der Kranz mit Markierung von der Achse angetrieben wird, an die auch das ZĂ€hlwerk gekoppelt ist. Stellen Sie den ZĂ€hler auf Null und starten Sie die Wiedergabe. Verfolgen Sie nun die Markierung mit freiem Auge und stoppen Sie die Wiedergabe nach zehn Umdrehungen. Das ÜbersetzungsverhĂ€ltnis bzw. die Anzahl der Umdrehungen/ZĂ€hlereinheit betrĂ€gt dann 10:ZĂ€hlerstand.

Die Bestimmung der StĂ€rke eines Bandes ist etwas heikler, da hierbei Ă€ußerst prĂ€zise gearbeitet werden muß; ein gutes Auge ist vonnöten. Bestimmen Sie zunĂ€chst die Anzahl der Wicklungen, die sich auf einem vollen Wickelteller befinden.

Spulen Sie dazu das Band völlig zurĂŒck und stellen Sie den ZĂ€hler auf Null. Spulen Sie dann das Band völlig um. Die Anzahl der Wicklungen ist dann das Produkt von ZĂ€hlerstand und ÜbersetzungsverhĂ€ltnis; 60er-Kassetten haben ca. 800, 90er-Kassetten ca. 1200 Wicklungen. Legen Sie das Band anschließend auf eine helle Unterlage und messen Sie die Dicke der Bandschicht auf dem vollen Wickelteller (in cm) -wenn möglich - auf einen halben Millimeter genau; ĂŒblicherweise ergeben sich Werte um 1,5 cm. Die BandstĂ€rke in cm ist dann der Quotient aus gemessener Schichtdicke und Anzahl der Wicklungen.

Das Programm ...

... wurde mit Pure C implementiert. Es bietet die Funktionen Band wĂ€hlen, Bandmaschine wĂ€hlen, ZĂ€hlerstand umrechnen und Intervall berechnen (Restspielzeitbestimmung!). BĂ€nder und Bandmaschinen mĂŒssen fest im Programm definiert werden. Das hat zwar den Nachteil, daß man, um z.B. ein neues Band zu definieren, das Programm verĂ€ndern muß, andererseits aber erspart das die Implementation einer kompletten Stammdatenverwaltung mit Laden, Speichern, Löschen, Fehlermeldungen etc.

Neue BĂ€nder oder GerĂ€te können durch einfaches AnfĂŒgen an die bereits bestehenden Definitionen definiert werden. Die notwendigen Parameter mĂŒssen dabei in der Reihenfolge angegeben werden, in der sie in den Strukturen Tape und Machine definiert sind.

Im vorliegenden Programm sind bereits einige gĂ€ngige BĂ€nder definiert, so daß Sie sich das aufwendige Ausmessen Ihrer bevorzugten BĂ€nder vielleicht ersparen können.

/* REALTIME Utility fĂŒr Bandaufnahmen v1.00 vom 03.10.1990 v2.00 vom 05.10.1990 v2.01 vom 20.10.1990 v2.02 vom 12.12.1991 von Michael Marte (c) 1992 MAXON Computer */ #include <stddef.h.> #include <stdlib.h> #include <stdio.h> #include <ext.h> /* Typendefinitionen */ typedef struct Machine MACHINE; typedef struct Tape TAPE; /* Strukturdefinitionen */ struct Machine{ char *name; float twd; /* Wickelkerndurchmesser in cm */ float tv; /* Bandgeschwindigkeit in cm/s */ float nrpcu; /* Laufwerk-ZĂ€hler-ÜbersetzungsverhĂ€ltnis */ }; struct Tape{ char *name; float td; /* BandstĂ€rke in cm */ }; /* Variablen- und Konstantendefinitionen */ MACHINE machine[]={ {"Technics RS-B505",2.2,4.8,2} }; TAPE tape[]={ {"BASF LH-EI 90",1.2981E-3}, {"BASF CR-E II 90",1.2361E-3}, {"FUJI JP-II 60",1.6564E-3}, {"FUJI DR 90",1.2570E-3}, {"MAXELL XL II-S 60",1.7359E-3}, {"SONY HF 90",1.2372E-3}, {"SONY UX-S 90a",1.2309E-3}, {"SONY UX-S 90c",1.2700E-3}, {"SONY UX-S 60c",1.7800E-3}, {"TDK SA 90",1.1818E-3}, {"TDK SA 90N",1.2302E-3}, {"TDK SA 100",1.1391E-3}, {"TDK SA-X 90",1.2404E-3}, {"TDK D 90", 1.2404E-3}, {"THAT'S VX 90",1.1785E-3} }; const float pi=3.141592654; const int nm=(int)(sizeof(machine)/sizeof(MACHINE)); /* Anzahl d. def. GerĂ€te */ const int nt=(int)(sizeof(tape)/sizeof(TAPE)); /* Anzahl d. def. BĂ€nder */ int miu=0; /* aktuelles GerĂ€t */ int tiu=0; /* aktuelles Band */ /* Prototypen */ void convert_counter(void); void compute_interval(void); void select_tape(void); void select_machine(void); float realtime(float c){ float nr=c*machine[miu].nrpcu; return (pi*nr*(tape[tiu].td*(nr-1)+machine[miu].twd))/machine[miu].tv; } main(){ int choice; do{ do{ printf("\x1b\x45" "REALTIME\n" "Utility fĂŒr Bandaufnahmen\n" "V2.02 vom 12.12.1991\n" "(c)1990 by Michael Marte\n\n" "1. ZĂ€hlerstand umrechnen\n" "2. Intervall berechnen\n" "3. Band wĂ€hlen (%s)\n" "4. GerĂ€t wĂ€hlen (%s)\n" "5. Ende\n\n" "Bitte wĂ€hlen Sie : ", tape[tiu].name,machine[miu].name); scanf ("%d",&choice) ; }while(choice<1 || choice>5); printf("\x1b\x45"); switch(choice){ case 1:convert_counter();break; case 2:compute_interval_();break; case 3:select_tape();break; case 4:select_machine();break; } }while(choice!=5); return 0; } void convert_counter(){ int t; float c; printf("ZĂ€hlerstand relativ zum Bandbeginn:"); scanf("%f",&c); t=(int)realtime(c); printf("entspricht %d min %d sec\n",t/60,t%60); printf("\n<Taste>\n");(void)getch(); } void compute_interval(){ int t1,t2,t; float c; printf("ZĂ€hlerstand am Intervallanfang : "); scanf("%f",&c); t1=(int)realtime(c); printf("entspricht %d min %d sec\n",t1/60,t1%60); printf("ZĂ€hlerstand am Intervallende : "); scanf("%f",&c); t2=(int)realtime(c); printf("entspricht %d min %d sec\n",t2/60,t2%60); t=t2-t1; printf("Das Intervall hat eine LĂ€nge von " "%d min %d sec.\n", t/60, t%60); printf("\n<Taste>\n");(void)getch(); } void select_tape(){ int cnt; /* Definierte BĂ€nder ausgeben */ for(cnt=0;cnt<nt;cnt++) printf("%d. %s td=%f mm\n",cnt,tape[cnt].name,tape[cnt].td*10); /* Band wĂ€hlen */ do{ printf("\nVerwendetes Band : "); scanf("%d",&tiu); }while(tiu<0 || tiu>nt-1); } void select_machine(){ int cnt; /* Definierte GerĂ€te ausgeben */ for(cnt=0;cnt<nm;cnt++) printf("%d. %s twd=%.2f cm tv=%.2f cm/s " "nrpcu=%.2f r/Einheit\n", cnt,machine[cnt].name, machine[cnt].twd, machine[cnt].tv,machine[cnt].nrpcu); /* GerĂ€t wĂ€hlen */ do{ printf("\nVerwendetes GerĂ€t : "); scanf("%d",&miu); }while(miu<0 || miu>nm-1); }
Michael Marte