Exemple #1
0
AmEvent* ErodeFilter::HandleEvent(AmEvent* event, const am_filter_params* /*params*/)
{
	if (!event) return event;
	ArpVALIDATE(mAddOn != NULL && mHolder != NULL, return event);

	event->SetNextFilter(mHolder->FirstConnection() );
	if (event->Type() == event->NOTEON_TYPE || event->Type() == event->NOTEOFF_TYPE) {
	
		AmNoteOn* note;
		note = dynamic_cast<AmNoteOn*>( event );
		if( !note ) return event;
	
		AmTime stoppingCondition = note->Duration() / 64;
		if (stoppingCondition <= 0) return event;

		AmNoteOn* nextNote = dynamic_cast<AmNoteOn*>( note->Copy() );
		AmNoteOn* prevNote = note;
	
		while ( nextNote != NULL && nextNote->Duration() >= stoppingCondition ) {
			if (nextNote->Duration() <= 0) {
				nextNote->Delete();
				return event;
			}
			if ( prevNote->Duration() < 4 ) return event;	
			nextNote->SetDuration(prevNote->Duration () * 0.75 );
			nextNote->SetStartTime(prevNote->EndTime() + 1);
			prevNote->AppendEvent(nextNote);
			prevNote = nextNote;
			nextNote = dynamic_cast<AmNoteOn*> ( nextNote->Copy() );
		}
	}
	return event;
}
void AmFilterTest1::TestBasic01()
{
	int i;
	
	printf("Making a vector.\n");
	vector<int, allocator<int> > myVect(2);
	myVect[0] = 1;
	
	printf("Making a map.\n");
	map< int, int, less<int>, allocator<int> > myMap;
	myMap[0] = 1;
	
	printf("Creating example filter object...\n");
	fflush(stdout);
	ArpExampleFilterAddon* exAddon = new ArpExampleFilterAddon;
	AmFilterHolder* exHolder = new AmFilterHolder;
	exHolder->SetFilter(exAddon->NewInstance(exHolder));
	
	printf("Creating BSynth filter object...\n");
	fflush(stdout);
#if 1
	AmConsumerFilterAddon* syAddon = new AmConsumerFilterAddon();
#else
	AmConsumerFilterAddon* syAddon = new AmConsumerFilterAddon("<midi port name>");
#endif
	/* NOTE:  The second consumer filter is not valid.  You need to
	 * supply the name of the midi port you want to use.
	 */
	AmFilterHolder* syHolder = new AmFilterHolder;
	syHolder->SetFilter(syAddon->NewInstance(syHolder));
	
	printf("Creating debug filter object...\n");
	fflush(stdout);
	ArpDebugFilterAddon* dbAddon = new ArpDebugFilterAddon(true);
	AmFilterHolder* dbHolder = new AmFilterHolder;
	dbHolder->SetFilter(dbAddon->NewInstance(dbHolder));
	
	printf("Attaching BSynth filter to example filter...\n");
	fflush(stdout);
	exHolder->AddSuccessor(syHolder);
	
	printf("Attaching debug filter to BSynth filter...\n");
	fflush(stdout);
	syHolder->AddSuccessor(dbHolder);
	
	printf("Creating a chain of NoteOn events...\n");
	fflush(stdout);
	AmEventI* evHead=NULL;
	AmEventI* evTail=NULL;
	for( i=1; i<=4; i++ ) {
		{
			AmProgramChange* ev = new AmProgramChange((i-1)*10,
																PPQN*4*i-((PPQN*3)/2));
			if( !evHead ) {
				evHead = ev;
			} else {
				evTail->AppendEvent(ev);
			}
			ev->SetNextFilter(exHolder);
			evTail = ev;
		}
		
		{
			AmNoteOn* ev = new AmNoteOn(60+5*i,100,PPQN*4*i);
			ev->SetRelVelocity(80);
			if( !evHead ) {
				evHead = ev;
			} else {
				evTail->AppendEvent(ev);
			}
			ev->SetNextFilter(exHolder);
			evTail = ev;
		}
		
		{
			AmTempoChange* ev = new AmTempoChange(120 + 40*i,PPQN*4*i);
			if( !evHead ) {
				evHead = ev;
			} else {
				evTail->AppendEvent(ev);
			}
			ev->SetNextFilter(exHolder);
			evTail = ev;
		}
	}
	
	printf("Initial Event Chain:\n");
	fflush(stdout);
	PrintEventChain(evHead);
	fflush(stdout);
	
	printf("Processing filters on event chain...\n");
	fflush(stdout);
	evHead = ArpExecFilters(evHead);
	
	printf("Final event chain:\n");
	fflush(stdout);
	PrintEventChain(evHead);
	fflush(stdout);
	
	printf("Performing the song!\n");
	fflush(stdout);
	{
		AmPerformer p;
		p.Start(evHead);
		// this is a bit of a hack to wait for it to finish;
		// it will be better when we flesh out the performer
		// interface to be able to send messages.
		do {
			snooze(1 * 1000000);	// wait for a sec
		} while( p.IsPlaying() );
	}
	fflush(stdout);
	
	printf("Placing the BSynth filter in its own list...\n");
	fflush(stdout);
	exHolder->RemoveSuccessor(syHolder);
	syHolder->RemoveSuccessor(dbHolder);
	
	printf("Creating a chain of sixteenth notes...\n");
	fflush(stdout);
	evHead = evTail = new AmProgramChange(B_KALIMBA, 0);
	evTail->SetNextFilter(syHolder);
	evTail->AppendEvent(new AmTempoChange(480, 0));
	evTail = evTail->TailEvent();
	evTail->SetNextFilter(syHolder);
	for( i=1; i<=4*4*4; i++ ) {
		{
			AmNoteOn* ev = new AmNoteOn(70+2*(i/(4*4)),100,PPQN*i/4);
			ev->SetDuration(PPQN/8);
			ev->SetRelVelocity(80);
			if( !evHead ) {
				evHead = ev;
			} else {
				evTail->AppendEvent(ev);
			}
			ev->SetNextFilter(syHolder);
			evTail = ev;
		}
	}
	
	printf("Performing the next song!\n");
	fflush(stdout);
	{
		AmPerformer p;
		p.Start(evHead);
		// this is a bit of a hack to wait for it to finish;
		// it will be better when we flesh out the performer
		// interface to be able to send messages.
		do {
			snooze(1 * 1000000);	// wait for a sec
		} while( p.IsPlaying() );
	}
	fflush(stdout);
	
	printf("Deleting filters -- WHICH FOR SOME REASON IS CRASHING, SO IT'S BEEN REMOVED.\n");
#if 0
	exHolder->Delete();
	exAddon->RemReference();
	syHolder->Delete();
	syAddon->RemReference();
	dbHolder->Delete();
	dbAddon->RemReference();
#endif	
	DoBigTest();
	
	printf("Repeating test...\n");
	fflush(stdout);
	
	DoBigTest();
}