Rx

2017-03-06 4 views
1

이있는 각 이벤트에 대해 지연된 두 번째 후속 이벤트 생성 현재 반응 형 프레임 워크로 MIDI 메시지를 처리하려고합니다.Rx

NoteOn 이벤트를 생성 할 때는 NoteOff 이벤트를 따라야합니다. 그렇다면 일정 시간이 지났을 때 각 노트 다음에 두 번째 이벤트를 보내는 가장 좋은 방법은 무엇일까요?

뭔가 같은 : NoteOn 및 NoteOff 메시지가 동일한 유형 MidiMessage의이다

//pseudo code 
var noteOnObservable = GetNoteOns(); 
var noteOffObservable = noteOnObservable.ForEach(e => new NoteOffMessage(e.MidiNote)) 
    .Delay(e => GetDelay(e)); 
var notes = noteOnObservable.Merge(noteOffObservable); 

.

답변

3

당신이 그랬던 것처럼. 이상적으로는 noteOnObservable를 게시 할 것입니다 그래서 당신은 여러 구독을하지 않아도 :

var noteOnObservable = GetNoteOns().Publish().RefCount(); 
var noteOffObservable = noteOnObservable 
    .Select(e => new NoteOffMessage(e.MidiNote)) 
    .Delay(e => GetDelay(e)); 
var notes = noteOnObservable.Merge(noteOffObservable); 

당신은 어떤 종류의 GetDelay 수익률을 설명하지 않았다. TimeSpan을 반환하면 관찰 가능으로 변환해야합니다. 가능하면 GetDelay 그 작품. 그렇지 않다면 다음을 수행 할 수 있습니다.

var noteOnObservable = GetNoteOns().Publish().RefCount(); 
var noteOffObservable = noteOnObservable 
    .Select(e => new NoteOffMessage(e.MidiNote)) 
    .Delay(e => Observable.Timer(GetDelay(e))); 
var notes = noteOnObservable.Merge(noteOffObservable); 
+0

내가 너무 가깝다는 것을 알지 못했습니다. Publish(). RefCount() 개선에 감사드립니다. 그 GetDelay는 아직 지정되지 않았습니다. 다음 작업입니다. Observable.Timer는 이벤트 당 개별 지연을 위해 작업할까요? – thalm

+0

예. 정적 인'TimeSpan' (모든 이벤트에 유니폼)을 지정하고 싶다면,'.Delay (TimeSpan.FromMilliseconds (100))'또는 적절한 시간이 무엇이든간에 할 수 있습니다. – Shlomo

+2

@Shlomo - 약간 더 깔끔한 방법은 다음과 같이하는 것입니다 : var notes = GetNoteOns(). Publish (gnos => gnos.Merge (gnos.Select (e => new NoteOffMessage (e.MidiNote)). 지연 e => GetDelay (e))));'. – Enigmativity