public void getn( final int[] offsets, final int[] numChans, final GetCompletionAction action )
	throws IOException
	{
		final int numEntries = offsets.length;
		if( numEntries != numChans.length ) {
			throw new IllegalArgumentException( "Number of offsets / numChans must be the same" );
		}

		final OSCMessage m = getnMsg( offsets, numChans );
		final int idx = getIndex();
		final OSCResponderNode resp = new OSCResponderNode( getServer(), "/c_setn", new OSCResponderNode.Action() {
			public void respond( OSCResponderNode r, OSCMessage msg, long time )
			{
				final int numArgs = msg.getArgCount();
				int numVals = 0;
				for( int i = 0, j = 0; j < numArgs; i++ ) {
					if( i >= numEntries ) return;
					final int nc = numChans[ i ];
					if( ((Number) msg.getArg( j++ )).intValue() != idx + offsets[ i ]) return;
					if( ((Number) msg.getArg( j++ )).intValue() != nc ) return;
					numVals += nc;
					j += nc;
				}
				
				final float[] vals = new float[ numVals ];
				for( int i = 0, j = 2, k = 0; i < numEntries; i++, j += 2 ) {
					for( int m = 0; m < numChans[ i ]; m++ ) {
						vals[ k++ ] = ((Number) msg.getArg( j++ )).floatValue();
					}
				}
				r.remove();
				action.completion( Bus.this, vals );
			}
		});
		resp.add();
		getServer().sendMsg( m );
	}