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