1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#!/usr/bin/perl -w --
$|=1; # disable output buffering
use strict;
use Switch;
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
open (MTCSOURCE, "amidi --dump --port=hw:1,0,0|");
my $set=0;
my $hour=0;
my $min=0;
my $sec=0;
my $frame=0;
my $tmptmphour=0;
my $tmptmpmin=0;
my $tmptmpsec=0;
my $tmptmpframe=0;
my $tmphour=0;
my $tmpmin=0;
my $tmpsec=0;
my $tmpframe=0;
my $qframe=-1;
my $settmp=0;
my $t0=[gettimeofday()];
my $t1;
my $elapsed;
while (<MTCSOURCE>) {
chomp($_);
if (/F0 7F (.*) 06 44 06 01 (.*) F7/) {
my @tc=split(' ',substr($_,21,14));
$hour=hex("0x".$tc[0]) & 31;
$min=hex("0x".$tc[1]);
$sec=hex("0x".$tc[2]);
$frame=hex("0x".$tc[3]);
$qframe=hex("0x".$tc[4]);
printf "%02d:%02d:%02d.%02d/%02d (LOCATE) \r",$hour,$min,$sec,$frame,$qframe;
next;
}
if (/F1 (.*)/) {
$t1=[gettimeofday()];
$elapsed=tv_interval($t0,$t1);
if ($elapsed>.1) {
$set=0;
$tmptmphour=0;
$tmptmpmin=0;
$tmptmpsec=0;
$tmptmpframe=0;
$settmp=0;
$qframe=-1;
$tmphour=0;
$tmpmin=0;
$tmpsec=0;
$tmpframe=0;
$hour=0;
$min=0;
$sec=0;
$frame=0;
}
$t0=$t1;
# print $_." | ";
my $nibble=hex ("0x".substr($1,1,1));
my $cmd=substr($1,0,1);
if ($set ==0) {
if ($cmd ne "0") {
print "skip\n";
next;
}
}
$settmp=0;
switch (0+substr($1,0,1)) {
case 0 {
$tmptmpframe=($tmptmpframe & 0xf0)|$nibble;
$set|=1;
}
case 1 {
$tmptmpframe=($tmptmpframe & 0x0f)|($nibble*16);
$set|=2;
$tmpframe=$tmptmpframe;
$settmp=1;
}
case 2 {
$set|=4;
$tmptmpsec=($tmptmpsec & 0xf0)|$nibble;
}
case 3 {
$set|=8;
$tmptmpsec=($tmptmpsec & 0x0f)|($nibble*16);
}
$tmpsec=$tmptmpsec;
case 4 {
$set|=16;
$tmptmpmin=($tmptmpmin & 0xf0)|$nibble;
}
case 5 {
$set|=32;
$tmptmpmin=($tmptmpmin & 0x0f)|($nibble*16);
$tmpmin=$tmptmpmin;
}
case 6 {
$set|=64;
$tmptmphour=($tmptmphour & 0xf0)|$nibble;
}
case 7 {
$set|=128;
$tmptmphour=($tmptmphour & 0x0f)|(($nibble*16)&1);
$tmphour=$tmptmphour;
}
}
$qframe++;
if ($qframe > 3) {
$qframe=0;
if ($settmp == 0) {
$tmpframe++;
}
$frame=$tmpframe;
$sec=$tmpsec;
$min=$tmpmin;
$hour=$tmphour;
}
if ($set==255) {
printf "%02d:%02d:%02d.%02d/%02d \r",$hour,$min,$sec,$frame,$qframe;
} else {
printf "%02d:%02d:%02d.%02d/%02d (no lock)\r",$hour,$min,$sec,$frame,$qframe;
}
}
}
close (MTCSOURCE);
|