From 2f28f20107a655ccf27e14e8dc21975877a51bc7 Mon Sep 17 00:00:00 2001 From: Ge Wang Date: Thu, 16 Nov 2023 22:59:54 -0800 Subject: [PATCH] add Osc ctor overload --- src/core/ugen_osc.cpp | 76 ++++++++++++++++++++------- src/core/ugen_osc.h | 2 + src/test/01-Basic/241-ctor-builtin.ck | 2 +- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/src/core/ugen_osc.cpp b/src/core/ugen_osc.cpp index 84d7c8fa3..0d8106aaf 100644 --- a/src/core/ugen_osc.cpp +++ b/src/core/ugen_osc.cpp @@ -81,6 +81,19 @@ DLL_QUERY osc_query( Chuck_DL_Query * QUERY ) osc_offset_data = type_engine_import_mvar( env, "int", "@osc_data", FALSE ); if( osc_offset_data == CK_INVALID_OFFSET ) goto error; + // overload constructor (float freq) + func = make_new_mfun( "void", "Osc", osc_ctor_1 ); + func->add_arg( "float", "freq" ); + func->doc = "Constructor to initialize a Osc at specified frequency."; + if( !type_engine_import_mfun( env, func ) ) goto error; + + // overload constructor (float freq, float phase) + func = make_new_mfun( "void", "Osc", osc_ctor_2 ); + func->add_arg( "float", "freq" ); + func->add_arg( "float", "phase" ); + func->doc = "Constructor to initialize a Osc at specified frequency and phase."; + if( !type_engine_import_mfun( env, func ) ) goto error; + // add ctrl: freq func = make_new_mfun( "float", "freq", osc_ctrl_freq ); func->add_arg( "float", "hz" ); @@ -402,20 +415,51 @@ CK_DLL_CTOR( osc_ctor ) + +//----------------------------------------------------------------------------- +// generic overloaded ctor( float freq ) +// to be used by Osc only +//----------------------------------------------------------------------------- +CK_DLL_MFUN( osc_ctor_1 ) +{ + // return (dummy struct since ctors don't return stuff) + Chuck_DL_Return r; + // call default ctor + osc_ctor( SELF, ARGS, VM, SHRED, API ); + // call common ctor + oscx_ctor_1( SELF, ARGS, &r, VM, SHRED, API ); +} + + + + +//----------------------------------------------------------------------------- +// generic overloaded ctor( float freq, float phase ) +// to be used by Osc only +//----------------------------------------------------------------------------- +CK_DLL_MFUN( osc_ctor_2 ) +{ + // return (dummy struct since ctors don't return stuff) + Chuck_DL_Return r; + // call default ctor + osc_ctor( SELF, ARGS, VM, SHRED, API ); + // call common ctor + oscx_ctor_2( SELF, ARGS, &r, VM, SHRED, API ); +} + + + + //----------------------------------------------------------------------------- // generic overloaded ctor( float freq ) // to be used by subclasses of Osc //----------------------------------------------------------------------------- CK_DLL_MFUN( oscx_ctor_1 ) { - // get the data - Osc_Data * d = (Osc_Data *)OBJ_MEMBER_UINT(SELF, osc_offset_data ); + // return (dummy struct since ctors don't return stuff) + Chuck_DL_Return r; // set freq - d->freq = GET_CK_FLOAT(ARGS); - // phase increment - d->num = d->freq / d->srate; - // bound it - if( d->num >= 1.0 ) d->num -= ::floor( d->num ); + osc_ctrl_freq( SELF, ARGS, &r, VM, SHRED, API ); } @@ -427,19 +471,13 @@ CK_DLL_MFUN( oscx_ctor_1 ) //----------------------------------------------------------------------------- CK_DLL_MFUN( oscx_ctor_2 ) { - // get the data - Osc_Data * d = (Osc_Data *)OBJ_MEMBER_UINT(SELF, osc_offset_data ); + // return (dummy struct since ctors don't return stuff) + Chuck_DL_Return r; // set freq - d->freq = GET_CK_FLOAT(ARGS); - // phase increment - d->num = d->freq / d->srate; - // bound it - if( d->num >= 1.0 ) d->num -= ::floor( d->num ); - - // set phase - d->phase = GET_CK_FLOAT(ARGS); - // bound ( this could be set arbitrarily high or low ) - if( d->phase >= 1.0 || d->phase < 0.0 ) d->phase -= floor( d->num );} + osc_ctrl_freq( SELF, ARGS, &r, VM, SHRED, API ); + // set freq + osc_ctrl_phase( SELF, ARGS, &r, VM, SHRED, API ); +} diff --git a/src/core/ugen_osc.h b/src/core/ugen_osc.h index f749388a0..ac09b33ee 100644 --- a/src/core/ugen_osc.h +++ b/src/core/ugen_osc.h @@ -44,6 +44,8 @@ DLL_QUERY osc_query( Chuck_DL_Query * query ); // osc - base CK_DLL_CTOR( osc_ctor ); CK_DLL_DTOR( osc_dtor ); +CK_DLL_MFUN( osc_ctor_1 ); +CK_DLL_MFUN( osc_ctor_2 ); CK_DLL_TICK( osc_tick ); CK_DLL_PMSG( osc_pmsg ); CK_DLL_CTRL( osc_ctrl_freq ); diff --git a/src/test/01-Basic/241-ctor-builtin.ck b/src/test/01-Basic/241-ctor-builtin.ck index 01554ebc3..c2b797120 100644 --- a/src/test/01-Basic/241-ctor-builtin.ck +++ b/src/test/01-Basic/241-ctor-builtin.ck @@ -1,4 +1,4 @@ -// constructor +// constructors SinOsc foo(440) => Gain g(.5) => dac; // test