code: function(key, initValue, obj) {
      var isTimeProp = Audio.Clock.timeProperties.indexOf( key ) > -1,
          prop = obj.properties[ key ] = {
            value:  isTimeProp ? Audio.Clock.time( initValue ) : initValue,
            binops: [],
            parent : obj,
            name : key,
          },
          mappingName = key.charAt(0).toUpperCase() + key.slice(1);
      
      Object.defineProperty(obj, key, {
        configurable: true,
        get: function() { return prop.value },
        set: function(val) { 
          if( obj[ mappingName ] && obj[ mappingName ].mapping ) {
            if( obj[ mappingName ].mapping.remove )
              obj[ mappingName ].mapping.remove( true ) // pass true to avoid setting property inside of remove method
          }
          
          // if( isTimeProp ) {
          //   if( typeof val === 'object' && val.mode ==='absolute' ) { // ms, seconds
          //     prop.value = val.value
          //   }else{
          //     prop.value = Audio.Core.Binops.Mul( Audio.Clock.time( val ), Audio.Core.Binops.Div( 1, Audio.Clock.rate ) ) 
          //   }
          // }else{
          //   prop.value = val
          // }
          // 
          prop.value = isTimeProp ? Audio.Clock.time( val ) : val
          
          Audio.Core.dirty( obj )
          
          return prop.value
        },
      });
  
      obj[key] = prop.value
    }
docs: override for Gibber.Audio.Core method