@Override protected void uGenerate(float[] channels) { // make sure we are generating the correct number of channels if (m_tickBuffer.length != channels.length) { m_tickBuffer = new float[channels.length]; // and propagate that to our list for (int i = 0; i < m_ugens.size(); ++i) { UGen u = m_ugens.get(i); if (u != null) { u.setAudioChannelCount(channels.length); } else // a null entry means it was unpatched, so go ahead and cull now { m_ugens.remove(i); --i; } } } // start with silence for (int i = 0; i < channels.length; ++i) { channels[i] = 0; } for (int i = 0; i < m_ugens.size(); ++i) { // m_tickBuffer should be filled with the correct audio // even if this ugen has generated audio already UGen u = m_ugens.get(i); if (u != null) { u.tick(m_tickBuffer); processSampleFrame(m_tickBuffer, channels); } else // a null entry means this ugen was unpatched, so we remove the entry { m_ugens.remove(i); --i; } } }