Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/Boare.Lib.Vsq/VsqNrpn.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (hide annotations) (download)
Wed Jul 29 17:03:20 2009 UTC (3 years, 9 months ago) by kbinani
File size: 6219 byte(s)
1 kbinani 6 /*
2     * VsqNrpn.cs
3     * Copyright (c) 2008-2009 kbinani
4     *
5     * This file is part of Boare.Lib.Vsq.
6     *
7     * Boare.Lib.Vsq is free software; you can redistribute it and/or
8     * modify it under the terms of the BSD License.
9     *
10     * Boare.Lib.Vsq is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13     */
14     using System;
15     using System.Collections.Generic;
16    
17     namespace Boare.Lib.Vsq {
18    
19 kbinani 8 public struct VsqNrpn : IComparable<VsqNrpn> {
20 kbinani 6 public int Clock;
21     public ushort Nrpn;
22     public byte DataMsb;
23     public byte DataLsb;
24 kbinani 8 public bool DataLsbSpecified;
25 kbinani 6 private List<VsqNrpn> m_list;
26    
27     public VsqNrpn( int clock, ushort nrpn, byte data_msb ) {
28     Clock = clock;
29     Nrpn = nrpn;
30     DataMsb = data_msb;
31 kbinani 8 DataLsb = 0x0;
32 kbinani 6 DataLsbSpecified = false;
33     m_list = new List<VsqNrpn>();
34     }
35    
36     public VsqNrpn( int clock, ushort nrpn, byte data_msb, byte data_lsb ) {
37     Clock = clock;
38     Nrpn = nrpn;
39     DataMsb = data_msb;
40     DataLsb = data_lsb;
41     DataLsbSpecified = true;
42     m_list = new List<VsqNrpn>();
43     }
44    
45     public VsqNrpn[] expand() {
46     List<VsqNrpn> ret = new List<VsqNrpn>();
47     if ( DataLsbSpecified ) {
48     ret.Add( new VsqNrpn( Clock, Nrpn, DataMsb, DataLsb ) );
49     } else {
50     ret.Add( new VsqNrpn( Clock, Nrpn, DataMsb ) );
51     }
52     for ( int i = 0; i < m_list.Count; i++ ) {
53     ret.AddRange( m_list[i].expand() );
54     }
55     return ret.ToArray();
56     }
57    
58 kbinani 8 public static List<VsqNrpn> sort( List<VsqNrpn> list ) {
59     List<VsqNrpn> ret = new List<VsqNrpn>();
60     list.Sort();
61     if ( list.Count >= 2 ) {
62     List<VsqNrpn> work = new List<VsqNrpn>(); //workには、clockが同じNRPNだけが入る
63     int last_clock = list[0].Clock;
64     work.Add( list[0] );
65     for ( int i = 1; i < list.Count; i++ ) {
66     if ( list[i].Clock == last_clock ) {
67     work.Add( list[i] );
68     } else {
69     // まずworkを並べ替え
70     last_clock = list[i].Clock;
71     bool changed = true;
72     while ( changed ) {
73     changed = false;
74     for ( int j = 0; j < work.Count - 1; j++ ) {
75     byte nrpn_msb0 = (byte)((work[j].Nrpn >> 8) & 0xff);
76     byte nrpn_msb1 = (byte)((work[j + 1].Nrpn >> 8) & 0xff);
77     if ( nrpn_msb1 > nrpn_msb0 ) {
78     VsqNrpn buf = work[j];
79     work[j] = work[j + 1];
80     work[j + 1] = buf;
81     changed = true;
82     }
83     }
84     }
85     for ( int j = 0; j < work.Count; j++ ) {
86     ret.Add( work[j] );
87     }
88     work.Clear();
89     work.Add( list[i] );
90     }
91     }
92     for ( int j = 0; j < work.Count; j++ ) {
93     ret.Add( work[j] );
94     }
95     } else {
96     for ( int i = 0; i < list.Count; i++ ) {
97     ret.Add( list[i] );
98     }
99     }
100     return ret;
101     }
102    
103 kbinani 6 public static VsqNrpn[] merge( VsqNrpn[] src1, VsqNrpn[] src2 ) {
104     List<VsqNrpn> ret = new List<VsqNrpn>();
105     for ( int i = 0; i < src1.Length; i++ ) {
106     ret.Add( src1[i] );
107     }
108     for ( int i = 0; i < src2.Length; i++ ) {
109     ret.Add( src2[i] );
110     }
111     ret.Sort();
112     return ret.ToArray();
113     }
114    
115     public static NrpnData[] convert( VsqNrpn[] source ) {
116     ushort nrpn = (ushort)source[0].Nrpn;
117     byte msb = (byte)(nrpn >> 8);
118     byte lsb = (byte)(nrpn - (nrpn << 8));
119     List<NrpnData> ret = new List<NrpnData>();
120     ret.Add( new NrpnData( source[0].Clock, 0x63, msb ) );
121     ret.Add( new NrpnData( source[0].Clock, 0x62, lsb ) );
122     ret.Add( new NrpnData( source[0].Clock, 0x06, source[0].DataMsb ) );
123     if ( source[0].DataLsbSpecified ) {
124     ret.Add( new NrpnData( source[0].Clock, 0x26, source[0].DataLsb ) );
125     }
126     byte last_msb = msb;
127     for ( int i = 1; i < source.Length; i++ ) {
128     ushort tnrpn = (ushort)source[i].Nrpn;
129     msb = (byte)(tnrpn >> 8);
130     lsb = (byte)(tnrpn - (tnrpn << 8));
131     //if ( msb != last_msb ) {
132     ret.Add( new NrpnData( source[i].Clock, 0x63, msb ) );
133     //} else if ( msb == 0x63 ) {
134     // ret.Add( new NrpnData( source[i].Clock, 0x63, msb ) );
135     //}
136     last_msb = msb;
137     ret.Add( new NrpnData( source[i].Clock, 0x62, lsb ) );
138     ret.Add( new NrpnData( source[i].Clock, 0x06, source[i].DataMsb ) );
139     if ( source[i].DataLsbSpecified ) {
140     ret.Add( new NrpnData( source[i].Clock, 0x26, source[i].DataLsb ) );
141     }
142     }
143     return ret.ToArray();
144     }
145    
146     public int CompareTo( VsqNrpn item ) {
147     return Clock - item.Clock;
148     }
149    
150 kbinani 8 public void append( ushort nrpn, byte data_msb ) {
151     m_list.Add( new VsqNrpn( Clock, nrpn, data_msb ) );
152 kbinani 6 }
153    
154 kbinani 8 public void append( ushort nrpn, byte data_msb, byte data_lsb ) {
155     m_list.Add( new VsqNrpn( Clock, nrpn, data_msb, data_lsb ) );
156 kbinani 6 }
157     }
158    
159     }

SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.