Example #1
0
import Ember from 'ember';

import ReadinessMixin from 'linx/mixins/readiness';
import WebAudioNodeMixin from 'linx/mixins/web-audio/node';
import { isValidNumber } from 'linx/lib/utils';

export default Ember.ObjectProxy.extend(
  WebAudioNodeMixin,
  ReadinessMixin('isAudioLoaded'), {

  // params
  audioBuffer: null, // WebAudioApi.AudioBuffer

  // implement web-audio/node
  node: null,
  outputNode: null,

  // implmement readiness
  isAudioLoaded: Ember.computed.bool('audioBuffer'),

  start(when, offset, duration) {
    // Ember.Logger.log('currentTime', this.get('audioContext.currentTime'));
    // Ember.Logger.log('startSource', when, offset);
    const args = [when, offset, duration].filter(isValidNumber);

    // web audio buffer sources can only be played once
    // therefore we must recreate source on each playback
    this.stop();
    const node = this.createBufferSource();
    node.start(...args);
  },
Example #2
0
  CONTROL_TYPE_MID_BAND,
  CONTROL_TYPE_HIGH_BAND,
  CONTROL_TYPE_DELAY_WET,
  CONTROL_TYPE_DELAY_CUTOFF,
  CONTROL_TYPE_FILTER_HIGHPASS_CUTOFF,
  CONTROL_TYPE_FILTER_HIGHPASS_Q,
  CONTROL_TYPE_FILTER_LOWPASS_CUTOFF,
  CONTROL_TYPE_FILTER_LOWPASS_Q,
} from 'linx/mixins/playable-arrangement/automatable-clip/control';
import { isValidNumber } from 'linx/lib/utils';

export default DS.Model.extend(
  PlayableArrangementMixin,
  DependentRelationshipMixin('fromTrackAutomationClips'),
  DependentRelationshipMixin('toTrackAutomationClips'),
  ReadinessMixin('isTransitionReady'), {

  title: DS.attr('string'),
  description: DS.attr('string'),
  beatCount: DS.attr('number', { defaultValue: 16 }),
  transitionClip: DS.belongsTo('mix/transition-clip'),

  fromTrackClip: Ember.computed.reads('transitionClip.fromTrackClip'),
  toTrackClip: Ember.computed.reads('transitionClip.toTrackClip'),

  fromTrackAutomationClips: DS.hasMany('mix/transition/from-track-automation-clip'),
  toTrackAutomationClips: DS.hasMany('mix/transition/to-track-automation-clip'),

  // implementing PlayableArrangement
  audioContext: Ember.computed.reads('transitionClip.audioContext'),
  outputNode: Ember.computed.reads('transitionClip.outputNode.content'),