void TakeRandomCols(COMMAND_T* = NULL) { COLORREF cr; // All black check if (AllBlack()) return; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL)) { for (int h = 0; h < CountTakes(mi); h++) { while (!(cr = g_custColors[rand() % 16])); cr |= 0x1000000; GetSetMediaItemTakeInfo(GetTake(mi, h), "I_CUSTOMCOLOR", &cr); } } } } Undo_OnStateChange(__LOCALIZE("Set takes in selected item(s) to random custom color(s)","sws_undo")); UpdateTimeline(); }
/****************************************************************************** * BR_MidiItemTimePos * ******************************************************************************/ BR_MidiItemTimePos::BR_MidiItemTimePos (MediaItem* item) : item (item), position (GetMediaItemInfo_Value(item, "D_POSITION")), length (GetMediaItemInfo_Value(item, "D_LENGTH")), timeBase (GetMediaItemInfo_Value(item, "C_BEATATTACHMODE")), looped (!!GetMediaItemInfo_Value(item, "B_LOOPSRC")), loopStart (-1), loopEnd (-1), loopedOffset (0) { // When restoring position and lenght, the only way to restore it for looped MIDI items is to use MIDI_SetItemExtents which will disable looping // for the whole item. Since we have no idea what will happen before this->Restore() is called take data for active MIDI item right now instead of // in this->Restore() (for example, if client calls SetIgnoreTempo() from BR_Util.h before restoring to disable "ignore project tempo" length of MIDI item source may change) if (looped) { if (MediaItem_Take* activeTake = GetActiveTake(item)) { double sourceLenPPQ = GetMidiSourceLengthPPQ(activeTake, true); loopStart = MIDI_GetProjTimeFromPPQPos(activeTake, sourceLenPPQ); // we're not using MIDI_GetProjTimeFromPPQPos(activeTake, 0) because later we will use MIDI_SetItemExtents to make sure looped item loopEnd = MIDI_GetProjTimeFromPPQPos(activeTake, sourceLenPPQ*2); // position info is restored and 0 PPQ in take could theoretically be behind project start in which case MIDI_SetItemExtents wont' work properly loopedOffset = GetMediaItemTakeInfo_Value(activeTake, "D_STARTOFFS"); } } int takeCount = CountTakes(item); for (int i = 0; i < takeCount; ++i) { MediaItem_Take* take = GetTake(item, i); int noteCount, ccCount, textCount; int midiEventCount = MIDI_CountEvts(take, ¬eCount, &ccCount, &textCount); // In case of looped item, if active take wasn't midi, get looped position here for first MIDI take if (looped && loopStart == -1 && loopEnd == -1 && IsMidi(take, NULL) && (midiEventCount > 0 || i == takeCount - 1)) { double sourceLenPPQ = GetMidiSourceLengthPPQ(take, true); loopStart = MIDI_GetProjTimeFromPPQPos(take, sourceLenPPQ); loopEnd = MIDI_GetProjTimeFromPPQPos(take, sourceLenPPQ*2); loopedOffset = GetMediaItemTakeInfo_Value(take, "D_STARTOFFS"); } if (midiEventCount > 0) { savedMidiTakes.push_back(BR_MidiItemTimePos::MidiTake(take, noteCount, ccCount, textCount)); BR_MidiItemTimePos::MidiTake* midiTake = &savedMidiTakes.back(); for (int i = 0; i < noteCount; ++i) midiTake->noteEvents.push_back(BR_MidiItemTimePos::MidiTake::NoteEvent(take, i)); for (int i = 0; i < ccCount; ++i) midiTake->ccEvents.push_back(BR_MidiItemTimePos::MidiTake::CCEvent(take, i)); for (int i = 0; i < textCount; ++i) midiTake->sysEvents.push_back(BR_MidiItemTimePos::MidiTake::SysEvent(take, i)); } } }
void GetMediaItemTakes(MediaItem* item, list<MediaItem_Take*> &takes, bool bActiveOnly) { takes.clear(); if(bActiveOnly) { MediaItem_Take* take = GetActiveTake(item); if(take) takes.push_back(take); } else { int takeIdx = 0; while(MediaItem_Take* take = GetTake(item, takeIdx)) { if(take) takes.push_back(take); takeIdx++; } } }
void TakeGradient(COMMAND_T* = NULL) { int tCurPos = 0; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL)) { for (int h = 0; h < CountTakes(mi); h++) { COLORREF cr = CalcGradient(g_crGradStart, g_crGradEnd, (double)tCurPos++ / (CountTakes(mi)-1)) | 0x1000000; GetSetMediaItemTakeInfo(GetTake(mi, h), "I_CUSTOMCOLOR", &cr); } tCurPos = 0; } } } Undo_OnStateChange(__LOCALIZE("Set takes in selected item(s) to color gradient","sws_undo")); UpdateTimeline(); }
void TakeOrderedCol(COMMAND_T* = NULL) { UpdateCustomColors(); int tCurPos = 0; for (int i = 1; i <= GetNumTracks(); i++) { MediaTrack* tr = CSurf_TrackFromID(i, false); for (int j = 0; j < GetTrackNumMediaItems(tr); j++) { MediaItem* mi = GetTrackMediaItem(tr, j); if (*(bool*)GetSetMediaItemInfo(mi, "B_UISEL", NULL)) { for (int h = 0; h < CountTakes(mi); h++) { COLORREF cr = g_custColors[tCurPos++ % 16] | 0x1000000; GetSetMediaItemTakeInfo(GetTake(mi, h), "I_CUSTOMCOLOR", &cr); } tCurPos = 0; } } } Undo_OnStateChange(__LOCALIZE("Set takes in selected item(s) to ordered custom colors","sws_undo")); UpdateTimeline(); }