XJ music engine  1.9.6
In-game runtime engine for XJ music.
Craft.h
Go to the documentation of this file.
1 // Copyright (c) XJ Music Inc. (https://xjmusic.com) All Rights Reserved.
2 
3 #ifndef XJ_MUSIC_CRAFT_H
4 #define XJ_MUSIC_CRAFT_H
5 
6 #include <cmath>
7 #include <functional>
8 #include <map>
9 #include <optional>
10 #include <set>
11 #include <string>
12 #include <utility>
13 #include <vector>
14 
19 
20 namespace XJ {
21 
25  class Craft : protected FabricationWrapper {
26  protected:
27  std::map<std::string, int> deltaIns;
28  std::map<std::string, int> deltaOuts;
29  std::set<Instrument::Type> finalizeAudioLengthsForInstrumentTypes;
30 
31  public:
36  public:
37  virtual ~InstrumentProvider() = default;
38 
39  virtual std::optional<Instrument> get(const ProgramVoice *voice);
40  };
41 
46  public:
47  explicit LambdaInstrumentProvider(std::function<std::optional<Instrument>(ProgramVoice)> func) : func_(
48  std::move(func)) {}
49 
50  std::optional<Instrument> get(const ProgramVoice *voice) override {
51  return func_(*voice);
52  }
53 
54  private:
55  std::function<std::optional<Instrument>(ProgramVoice)> func_;
56  };
57 
62  public:
63  virtual ~ChoiceIndexProvider() = default;
64 
65  virtual std::string get(const SegmentChoice *choice);
66  };
67 
72  public:
73  explicit LambdaChoiceIndexProvider(std::function<std::string(SegmentChoice)> func) : func_(std::move(func)) {}
74 
75  std::string get(const SegmentChoice *choice) override {
76  return func_(*choice);
77  }
78 
79  private:
80  std::function<std::string(SegmentChoice)> func_;
81  };
82 
86  class Section {
87  public:
89  float fromPos{};
90  float toPos{};
91  };
92 
94 
100  explicit Craft(Fabricator *fabricator);
101 
108  [[nodiscard]] bool isIntroSegment(const SegmentChoice *choice) const;
109 
116  [[nodiscard]] bool isOutroSegment(const SegmentChoice *choice) const;
117 
124  [[nodiscard]] bool isSilentEntireSegment(const SegmentChoice *choice) const;
125 
132  [[nodiscard]] bool isActiveEntireSegment(const SegmentChoice *choice) const;
133 
155  void craftNoteEventArrangements(float tempo, const SegmentChoice *choice, bool defaultAtonal);
156 
172  void precomputeDeltas(
173  const std::function<bool(const SegmentChoice *)> &choiceFilter,
174  const ChoiceIndexProvider &setChoiceIndexProvider,
175  const std::vector<std::string> &layersInCraftOrder,
176  const std::set<std::string> &layerPrioritizationSearches,
177  const int numLayersIncoming);
178 
187  static bool inBounds(int floor, int ceiling, float value);
188 
195  static bool isUnlimitedIn(const SegmentChoice &choice);
196 
203  static bool isUnlimitedOut(const SegmentChoice &choice);
204 
212  [[nodiscard]] std::optional<const Program *>
213  chooseFreshProgram(Program::Type programType, std::optional<Instrument::Type> voicingType) const;
214 
224  [[nodiscard]] std::optional<const Instrument *>
225  chooseFreshInstrument(Instrument::Type type, const std::set<std::string> &requireEventNames) const;
226 
239  [[nodiscard]] std::optional<const InstrumentAudio *>
241  const std::set<Instrument::Type> &types,
242  const std::set<Instrument::Mode> &modes,
243  const std::set<UUID> &avoidIds,
244  const std::set<std::string> &preferredEvents) const;
245 
253  [[nodiscard]] std::optional<const InstrumentAudio *>
254  selectNewChordPartInstrumentAudio(const Instrument *instrument, const Chord &chord) const;
255 
262  [[nodiscard]] std::set<const InstrumentAudio *> selectGeneralAudioIntensityLayers(const Instrument *instrument) const;
263 
264  protected:
271  [[nodiscard]] std::set<const Program *> programsDirectlyBound(const std::set<const Program *> &programs) const;
272 
279  static std::set<const Program *> programsPublished(const std::set<const Program *> &programs);
280 
287  [[nodiscard]] std::set<const Instrument *>
288  instrumentsDirectlyBound(const std::set<const Instrument *> &instruments) const;
289 
296  [[nodiscard]] static std::set<const Instrument *>
297  instrumentsPublished(const std::set<const Instrument *> &instruments);
298 
305  [[nodiscard]] std::set<const InstrumentAudio *>
306  audiosDirectlyBound(const std::set<const InstrumentAudio *> &instrumentAudios) const;
307 
314  [[nodiscard]] std::set<const InstrumentAudio *>
315  audiosPublished(const std::set<const InstrumentAudio *> &instrumentAudios) const;
316 
323  [[nodiscard]] bool computeMute(Instrument::Type instrumentType) const;
324 
335  void pickInstrumentAudio(
336  const SegmentChoiceArrangement *arrangement,
337  const InstrumentAudio *audio,
338  long startAtSegmentMicros,
339  long lengthMicros,
340  const std::string& event) const;
341 
350  [[nodiscard]] std::set<const InstrumentAudio *>
351  selectAudioIntensityLayers(std::set<const InstrumentAudio *> audios, const int layers) const;
352 
363  void craftNoteEvents(
364  float tempo,
365  const ProgramSequence *sequence,
366  const std::set<const ProgramVoice *> &voices,
367  LambdaInstrumentProvider instrumentProvider);
368 
377  void craftChordParts(float tempo, const Instrument *instrument);
378 
388  void craftChordParts(float tempo, const Instrument *instrument, const SegmentChoice *choice);
389 
398  void craftEventParts(float tempo, const Instrument *instrument, const Program *program);
399 
406  int computeDeltaIn(const SegmentChoice *choice);
407 
414  int computeDeltaOut(const SegmentChoice *choice);
415 
416  private:
417  std::random_device rd;
418  std::mt19937 gen{rd()};
419 
431  void
432  craftNoteEventSectionRestartingEachChord(float tempo, const SegmentChoice *choice, NoteRange *range,
433  bool defaultAtonal) const;
434 
440  [[nodiscard]] std::vector<Section> computeSections() const;
441 
453  void craftNoteEventSection(
454  float tempo,
455  const SegmentChoice *choice,
456  float fromPos,
457  float maxPos,
458  NoteRange *range,
459  bool defaultAtonal) const;
460 
474  float craftPatternEvents(
475  float tempo,
476  const SegmentChoice *choice,
477  const ProgramSequencePattern *pattern,
478  float fromPosition,
479  float toPosition,
480  NoteRange *range,
481  bool defaultAtonal) const;
482 
497  void pickNotesAndInstrumentAudioForEvent(
498  const float tempo,
499  const Instrument *instrument,
500  const SegmentChoice *choice,
501  const SegmentChoiceArrangement *arrangement,
502  const float fromPosition,
503  const float toPosition,
504  const ProgramSequencePatternEvent *event,
505  NoteRange *range,
506  const bool defaultAtonal) const;
507 
508 
515  void finalizeNoteEventCutoffsOfOneShotInstrumentAudioPicks(const SegmentChoice *choice);
516 
524  [[nodiscard]] float computeVolumeRatioForPickedNote(const SegmentChoice &choice, float segmentPosition) const;
525 
539  [[nodiscard]] std::set<std::string> pickNotesForEvent(
540  Instrument::Type instrumentType,
541  const SegmentChoice *choice,
542  const ProgramSequencePatternEvent *event,
543  const SegmentChord *rawSegmentChord,
544  const SegmentChordVoicing *voicing,
545  NoteRange *optimalRange) const;
546 
564  void pickInstrumentAudio(
565  const std::string &note,
566  const Instrument *instrument,
567  const ProgramSequencePatternEvent *event,
568  const SegmentChoiceArrangement *segmentChoiceArrangement,
569  const long &startAtSegmentMicros,
570  const std::optional<long> &lengthMicros,
571  const std::optional<UUID> &segmentChordVoicingId,
572  const float &volRatio) const;
573 
584  std::optional<const InstrumentAudio *>
585  selectMultiphonicInstrumentAudio(const Instrument *instrument, const ProgramSequencePatternEvent *event,
586  const std::string &note) const;
587 
598  [[nodiscard]] std::optional<const InstrumentAudio *>
599  selectMonophonicInstrumentAudio(const Instrument *instrument, const ProgramSequencePatternEvent *event) const;
600 
611  [[nodiscard]] std::optional<const InstrumentAudio *>
612  selectChordPartInstrumentAudio(const Instrument *instrument, const Chord &chord) const;
613 
621  [[nodiscard]] std::optional<const InstrumentAudio *>
622  selectNewNoteEventInstrumentAudio(const Instrument *instrument, const ProgramSequencePatternEvent *event) const;
623 
633  std::optional<const InstrumentAudio *>
634  selectNewMultiphonicInstrumentAudio(const Instrument *instrument, std::string note) const;
635 
645  bool
646  instrumentContainsAudioEventsLike(const Instrument &instrument, const std::set<std::string> &requireEvents) const;
647  };
648 
649 }// namespace XJ
650 
651 #endif//XJ_MUSIC_CRAFT_H
Definition: Chord.h:53
Definition: Craft.h:61
virtual std::string get(const SegmentChoice *choice)
Definition: Craft.cpp:1030
virtual ~ChoiceIndexProvider()=default
Definition: Craft.h:35
virtual ~InstrumentProvider()=default
virtual std::optional< Instrument > get(const ProgramVoice *voice)
Definition: Craft.cpp:1038
LambdaChoiceIndexProvider(std::function< std::string(SegmentChoice)> func)
Definition: Craft.h:73
std::string get(const SegmentChoice *choice) override
Definition: Craft.h:75
LambdaInstrumentProvider(std::function< std::optional< Instrument >(ProgramVoice)> func)
Definition: Craft.h:47
std::optional< Instrument > get(const ProgramVoice *voice) override
Definition: Craft.h:50
Definition: Craft.h:86
float fromPos
Definition: Craft.h:89
const SegmentChord * chord
Definition: Craft.h:88
float toPos
Definition: Craft.h:90
Definition: Craft.h:25
static bool isUnlimitedIn(const SegmentChoice &choice)
Definition: Craft.cpp:141
std::optional< const InstrumentAudio * > selectNewChordPartInstrumentAudio(const Instrument *instrument, const Chord &chord) const
Definition: Craft.cpp:281
std::optional< const Program * > chooseFreshProgram(Program::Type programType, std::optional< Instrument::Type > voicingType) const
Definition: Craft.cpp:150
int computeDeltaIn(const SegmentChoice *choice)
Definition: Craft.cpp:584
void craftNoteEvents(float tempo, const ProgramSequence *sequence, const std::set< const ProgramVoice * > &voices, LambdaInstrumentProvider instrumentProvider)
Definition: Craft.cpp:439
Craft(Fabricator *fabricator)
Definition: Craft.cpp:10
std::optional< const Instrument * > chooseFreshInstrument(Instrument::Type type, const std::set< std::string > &requireEventNames) const
Definition: Craft.cpp:191
static std::set< const Program * > programsPublished(const std::set< const Program * > &programs)
Definition: Craft.cpp:327
void precomputeDeltas(const std::function< bool(const SegmentChoice *)> &choiceFilter, const ChoiceIndexProvider &setChoiceIndexProvider, const std::vector< std::string > &layersInCraftOrder, const std::set< std::string > &layerPrioritizationSearches, const int numLayersIncoming)
Definition: Craft.cpp:54
std::set< const InstrumentAudio * > selectAudioIntensityLayers(std::set< const InstrumentAudio * > audios, const int layers) const
Definition: Craft.cpp:403
static bool inBounds(int floor, int ceiling, float value)
Definition: Craft.cpp:134
bool computeMute(Instrument::Type instrumentType) const
Definition: Craft.cpp:380
bool isActiveEntireSegment(const SegmentChoice *choice) const
Definition: Craft.cpp:30
bool isIntroSegment(const SegmentChoice *choice) const
Definition: Craft.cpp:14
std::optional< const InstrumentAudio * > chooseFreshInstrumentAudio(const std::set< Instrument::Type > &types, const std::set< Instrument::Mode > &modes, const std::set< UUID > &avoidIds, const std::set< std::string > &preferredEvents) const
Definition: Craft.cpp:224
bool isSilentEntireSegment(const SegmentChoice *choice) const
Definition: Craft.cpp:25
std::set< const Instrument * > instrumentsDirectlyBound(const std::set< const Instrument * > &instruments) const
Definition: Craft.cpp:337
void craftNoteEventArrangements(float tempo, const SegmentChoice *choice, bool defaultAtonal)
Definition: Craft.cpp:35
void craftChordParts(float tempo, const Instrument *instrument)
Definition: Craft.cpp:488
std::set< const InstrumentAudio * > selectGeneralAudioIntensityLayers(const Instrument *instrument) const
Definition: Craft.cpp:299
std::map< std::string, int > deltaOuts
Definition: Craft.h:28
ChoiceIndexProvider choiceIndexProvider
Definition: Craft.h:93
std::set< const InstrumentAudio * > audiosPublished(const std::set< const InstrumentAudio * > &instrumentAudios) const
Definition: Craft.cpp:369
void pickInstrumentAudio(const SegmentChoiceArrangement *arrangement, const InstrumentAudio *audio, long startAtSegmentMicros, long lengthMicros, const std::string &event) const
Definition: Craft.cpp:384
std::map< std::string, int > deltaIns
Definition: Craft.h:27
static bool isUnlimitedOut(const SegmentChoice &choice)
Definition: Craft.cpp:145
static std::set< const Instrument * > instrumentsPublished(const std::set< const Instrument * > &instruments)
Definition: Craft.cpp:347
std::set< const InstrumentAudio * > audiosDirectlyBound(const std::set< const InstrumentAudio * > &instrumentAudios) const
Definition: Craft.cpp:358
std::set< Instrument::Type > finalizeAudioLengthsForInstrumentTypes
Definition: Craft.h:29
bool isOutroSegment(const SegmentChoice *choice) const
Definition: Craft.cpp:19
void craftEventParts(float tempo, const Instrument *instrument, const Program *program)
Definition: Craft.cpp:567
int computeDeltaOut(const SegmentChoice *choice)
Definition: Craft.cpp:589
std::set< const Program * > programsDirectlyBound(const std::set< const Program * > &programs) const
Definition: Craft.cpp:317
Definition: FabricationWrapper.h:14
Fabricator * fabricator
Definition: FabricationWrapper.h:16
Definition: Fabricator.h:48
Definition: InstrumentAudio.h:13
Definition: Instrument.h:14
Type
Definition: Instrument.h:16
Definition: NoteRange.h:15
Definition: ProgramSequencePatternEvent.h:13
Definition: ProgramSequencePattern.h:13
Definition: ProgramSequence.h:13
Definition: ProgramVoice.h:13
Definition: Program.h:14
Type
Definition: Program.h:16
Definition: SegmentChoiceArrangement.h:14
Definition: SegmentChoice.h:15
Definition: SegmentChordVoicing.h:16
Definition: SegmentChord.h:13
Definition: ActiveAudio.h:11