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 18 - (show annotations) (download)
Wed Mar 17 03:14:08 2010 UTC (3 years, 2 months ago) by kbinani
File size: 7794 byte(s)
[trunk] (ry
1 /*
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 #if JAVA
15 package org.kbinani.vsq;
16
17 import java.util.*;
18 #else
19 using System;
20 using bocoree;
21 using bocoree.java.util;
22
23 namespace Boare.Lib.Vsq {
24 using boolean = System.Boolean;
25 #endif
26
27 #if JAVA
28 public class VsqNrpn implements Comparable<VsqNrpn> {
29 #else
30 public struct VsqNrpn : IComparable<VsqNrpn> {
31 #endif
32 public int Clock;
33 public int Nrpn;
34 public byte DataMsb;
35 public byte DataLsb;
36 public boolean DataLsbSpecified;
37 public boolean msbOmitRequired;
38 private Vector<VsqNrpn> m_list;
39
40 public VsqNrpn( int clock, int nrpn, byte data_msb ) {
41 Clock = clock;
42 Nrpn = nrpn;
43 DataMsb = data_msb;
44 DataLsb = 0x0;
45 DataLsbSpecified = false;
46 msbOmitRequired = false;
47 m_list = new Vector<VsqNrpn>();
48 }
49
50 public VsqNrpn( int clock, int nrpn, byte data_msb, byte data_lsb ) {
51 Clock = clock;
52 Nrpn = nrpn;
53 DataMsb = data_msb;
54 DataLsb = data_lsb;
55 DataLsbSpecified = true;
56 msbOmitRequired = false;
57 m_list = new Vector<VsqNrpn>();
58 }
59
60 public VsqNrpn[] expand() {
61 Vector<VsqNrpn> ret = new Vector<VsqNrpn>();
62 if ( DataLsbSpecified ) {
63 VsqNrpn v = new VsqNrpn( Clock, Nrpn, DataMsb, DataLsb );
64 v.msbOmitRequired = msbOmitRequired;
65 ret.add( v );
66 } else {
67 VsqNrpn v = new VsqNrpn( Clock, Nrpn, DataMsb );
68 v.msbOmitRequired = msbOmitRequired;
69 ret.add( v );
70 }
71 for ( int i = 0; i < m_list.size(); i++ ) {
72 ret.addAll( Arrays.asList( m_list.get( i ).expand() ) );
73 }
74 return ret.toArray( new VsqNrpn[] { } );
75 }
76
77 public static Vector<VsqNrpn> sort( Vector<VsqNrpn> list ) {
78 Vector<VsqNrpn> ret = new Vector<VsqNrpn>();
79 Collections.sort( list );
80 if ( list.size() >= 2 ) {
81 Vector<VsqNrpn> work = new Vector<VsqNrpn>(); //workには、clockが同じNRPNだけが入る
82 int last_clock = list.get( 0 ).Clock;
83 work.add( list.get( 0 ) );
84 for ( int i = 1; i < list.size(); i++ ) {
85 if ( list.get( i ).Clock == last_clock ) {
86 work.add( list.get( i ) );
87 } else {
88 // まずworkを並べ替え
89 last_clock = list.get( i ).Clock;
90 boolean changed = true;
91 while ( changed ) {
92 changed = false;
93 for ( int j = 0; j < work.size() - 1; j++ ) {
94 byte nrpn_msb0 = (byte)((work.get( j ).Nrpn >> 8) & 0xff);
95 byte nrpn_msb1 = (byte)((work.get( j + 1 ).Nrpn >> 8) & 0xff);
96 if ( nrpn_msb1 > nrpn_msb0 ) {
97 VsqNrpn buf = work.get( j );
98 work.set( j, work.get( j + 1 ) );
99 work.set( j + 1, buf );
100 changed = true;
101 }
102 }
103 }
104 for ( int j = 0; j < work.size(); j++ ) {
105 ret.add( work.get( j ) );
106 }
107 work.clear();
108 work.add( list.get( i ) );
109 }
110 }
111 for ( int j = 0; j < work.size(); j++ ) {
112 ret.add( work.get( j ) );
113 }
114 } else {
115 for ( int i = 0; i < list.size(); i++ ) {
116 ret.add( list.get( i ) );
117 }
118 }
119 return ret;
120 }
121
122 public static VsqNrpn[] merge( VsqNrpn[] src1, VsqNrpn[] src2 ) {
123 Vector<VsqNrpn> ret = new Vector<VsqNrpn>();
124 for ( int i = 0; i < src1.Length; i++ ) {
125 ret.add( src1[i] );
126 }
127 for ( int i = 0; i < src2.Length; i++ ) {
128 ret.add( src2[i] );
129 }
130 Collections.sort( ret );
131 return ret.toArray( new VsqNrpn[] { } );
132 }
133
134 public static NrpnData[] convert( VsqNrpn[] source ) {
135 int nrpn = source[0].Nrpn;
136 byte msb = (byte)(nrpn >> 8);
137 byte lsb = (byte)(nrpn - (nrpn << 8));
138 Vector<NrpnData> ret = new Vector<NrpnData>();
139 ret.add( new NrpnData( source[0].Clock, (byte)0x63, msb ) );
140 ret.add( new NrpnData( source[0].Clock, (byte)0x62, lsb ) );
141 ret.add( new NrpnData( source[0].Clock, (byte)0x06, source[0].DataMsb ) );
142 if ( source[0].DataLsbSpecified ) {
143 ret.add( new NrpnData( source[0].Clock, (byte)0x26, source[0].DataLsb ) );
144 }
145 for ( int i = 1; i < source.Length; i++ ) {
146 VsqNrpn item = source[i];
147 int tnrpn = item.Nrpn;
148 msb = (byte)(tnrpn >> 8);
149 lsb = (byte)(tnrpn - (tnrpn << 8));
150 if ( item.msbOmitRequired ) {
151 ret.add( new NrpnData( item.Clock, (byte)0x62, lsb ) );
152 ret.add( new NrpnData( item.Clock, (byte)0x06, item.DataMsb ) );
153 if ( item.DataLsbSpecified ) {
154 ret.add( new NrpnData( item.Clock, (byte)0x26, item.DataLsb ) );
155 }
156 } else {
157 ret.add( new NrpnData( item.Clock, (byte)0x63, msb ) );
158 ret.add( new NrpnData( item.Clock, (byte)0x62, lsb ) );
159 ret.add( new NrpnData( item.Clock, (byte)0x06, item.DataMsb ) );
160 if ( item.DataLsbSpecified ) {
161 ret.add( new NrpnData( item.Clock, (byte)0x26, item.DataLsb ) );
162 }
163 }
164 }
165 return ret.toArray( new NrpnData[] { } );
166 }
167
168 public int compareTo( VsqNrpn item ) {
169 return Clock - item.Clock;
170 }
171
172 #if !JAVA
173 public int CompareTo( VsqNrpn item ) {
174 return compareTo( item );
175 }
176 #endif
177
178 public void append( int nrpn, byte data_msb ) {
179 m_list.add( new VsqNrpn( Clock, nrpn, data_msb ) );
180 }
181
182 public void append( int nrpn, byte data_msb, byte data_lsb ) {
183 m_list.add( new VsqNrpn( Clock, nrpn, data_msb, data_lsb ) );
184 }
185
186 public void append( int nrpn, byte data_msb, boolean msb_omit_required ) {
187 VsqNrpn v = new VsqNrpn( Clock, nrpn, data_msb );
188 v.msbOmitRequired = msb_omit_required;
189 m_list.add( v );
190 }
191
192 public void append( int nrpn, byte data_msb, byte data_lsb, boolean msb_omit_required ) {
193 VsqNrpn v = new VsqNrpn( Clock, nrpn, data_msb, data_lsb );
194 v.msbOmitRequired = msb_omit_required;
195 m_list.add( v );
196 }
197 }
198
199 #if !JAVA
200 }
201 #endif

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