Example #1
0
void generate_items_sequence(std::shared_ptr<breakpoint_envelope> env, const char* fn)
{
	SetCursorContext(1, NULL);
	Main_OnCommand(40182, 0); // select all items
	Main_OnCommand(40006, 0); // remove selected items
	MediaTrack* dest_track = GetTrack(nullptr, 0);
	double timepos = 0.0;
	double seqlen = 30.0;
	int sanity = 0;
	while (timepos < seqlen)
	{
		create_item_result r = create_item_with_take_and_source(dest_track, fn);
		SetMediaItemPosition(r.item, timepos, false);
		double srclen = GetMediaSourceLength(r.src, nullptr);
		double normtime = 1.0 / seqlen * timepos;
		double directionfactor = skip_near_zero(-1.0 + 2.0*env->interpolate(normtime), 0.02);
		if (directionfactor < 0.0)
		{
			//readbg() << "item " << sanity << " should be reversed\n";
			SetMediaItemSelected(r.item, true);
			Main_OnCommand(41051, 0); // toggle reverse
			SetMediaItemSelected(r.item, false);
		}


		double absfactor = fabs(directionfactor);
		double itemlen = bound_value(0.02, srclen*absfactor, srclen);
		SetMediaItemLength(r.item, itemlen, false);
		SetMediaItemTakeInfo_Value(r.take, "D_PLAYRATE", 1.0 / absfactor);
		timepos += srclen*absfactor;
		++sanity;
		if (sanity > 1000)
		{
			readbg() << "too many items created!\n";
			break;
		}
	}
	UpdateArrange();
}
Example #2
0
void SCL::update_edge_cache(fe_func_t& v_h) 
{
  fe_space_t::DGElementIterator 
    the_dgele = fem_space->beginDGElement(),
    end_dgele = fem_space->endDGElement();
  for (;the_dgele != end_dgele;++ the_dgele) {
    GET_EDGE_CACHE(*the_dgele);

    const element_t& neigh0 = the_dgele->neighbourElement(0);
    u_h_val0 = v_h.value(bas_val0, neigh0);
    if (the_dgele->p_neighbourElement(1) != NULL) { /// 内部边
      const element_t& neigh1 = the_dgele->neighbourElement(1);
      u_h_val1 = v_h.value(bas_val1, neigh1);
    } else if (the_dgele->boundaryMark() <= 0) { /// 分区间的内边界
      std::vector<double> * p_buf = syncer.get_send_buffer(*the_dgele);
      (*p_buf) = u_h_val0;
    } else { /// 物理区域的边界
      u_h_val1 = u_h_val0;
      bound_value(q_pnt, u_h_val1, un, *the_dgele);
    }
  }

  syncer.sync(is_update_transmit_map); /// 完成分区间的数据交换
  is_update_transmit_map = false; /// 将旗标改变为假

  the_dgele = fem_space->beginDGElement();
  for (;the_dgele != end_dgele;++ the_dgele) {
    GET_EDGE_CACHE(*the_dgele);
    /**
     * 第一个邻居单元为空,并且自身的边界标识为 0 的情形就是分区间的内
     * 边界。首先拿出数据接收缓冲区,然后将其中的数据拷贝到变量中。
     */
    if (the_dgele->p_neighbourElement(1) == NULL &&
        the_dgele->boundaryMark() <= 0) {
      std::vector<double> * p_buf = syncer.get_recv_buffer(*the_dgele);
      u_h_val1 = (*p_buf);
    }
  }
}
Example #3
0
		delete vecptr;
		g_active_mrp_arrays.erase(arg[0]);
	}
	return (void*)nullptr;
},
"Destroy a previously created MRP_Array"
);

function_entry MRP_GenerateSine("void", "MRP_Array*,double,double", "array,samplerate,frequency", [](params) {
	if (g_active_mrp_arrays.count(arg[0]) == 0)
	{
		ReaScriptError("MRP_GenerateSine : passed in invalid MRP_Array");
		return (void*)nullptr;
	}
	std::vector<double>& vecref = *(std::vector<double>*)arg[0];
	double sr = bound_value(1.0,*(double*)arg[1],1000000.0);
	double hz = bound_value(0.0001,*(double*)arg[2],sr/2.0);
	int numsamples = vecref.size();
	for (size_t i = 0; i < numsamples; ++i)
		vecref[i] = sin(2*3.141592653/sr*hz*i);
	return (void*)nullptr;
},
"Generate a sine wave into a MRP_Array"
);

function_entry MRP_MultiplyArrays("void", "MRP_Array*,MRP_Array*,MRP_Array*", "array1, array2, array3", [](params) {
	if (g_active_mrp_arrays.count(arg[0]) == 0 || g_active_mrp_arrays.count(arg[1]) == 0
		|| g_active_mrp_arrays.count(arg[2]) == 0)
	{
		ReaScriptError("MRP_MultiplyArrays : passed in invalid MRP_Array(s)");
		return (void*)nullptr;