SubInstrument.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import {Instrument} from "./Instrument";
  2. import {MidiInstrument} from "./VoiceData/Instructions/ClefInstruction";
  3. import log from "loglevel";
  4. export class SubInstrument {
  5. constructor(parentInstrument: Instrument) {
  6. this.parentInstrument = parentInstrument;
  7. this.fixedKey = -1;
  8. this.name = this.parseMidiInstrument(this.parentInstrument.Name);
  9. this.midiInstrumentID = SubInstrument.midiInstrument[this.name];
  10. this.volume = 1.0;
  11. }
  12. private static midiInstrument: { [key: string]: MidiInstrument } = {
  13. "alt": MidiInstrument.Synth_Voice,
  14. "alto": MidiInstrument.Synth_Voice,
  15. "banjo": MidiInstrument.Banjo,
  16. "bariton": MidiInstrument.Synth_Voice,
  17. "baritone": MidiInstrument.Synth_Voice,
  18. "bass": MidiInstrument.Synth_Voice,
  19. "blockflöte": MidiInstrument.Recorder,
  20. "brass": MidiInstrument.Trombone,
  21. "bratsche": MidiInstrument.Viola,
  22. "cello": MidiInstrument.Cello,
  23. "clarinet": MidiInstrument.Clarinet,
  24. "contrabass": MidiInstrument.Contrabass,
  25. "drums": MidiInstrument.Percussion,
  26. "flute": MidiInstrument.Flute,
  27. "flöte": MidiInstrument.Flute,
  28. "frenchhorn": MidiInstrument.French_Horn,
  29. "gitarre": MidiInstrument.Acoustic_Guitar_nylon,
  30. "guitar": MidiInstrument.Acoustic_Guitar_nylon,
  31. "harfe": MidiInstrument.Orchestral_Harp,
  32. "harp": MidiInstrument.Orchestral_Harp,
  33. "klarinette": MidiInstrument.Clarinet,
  34. "klavier": MidiInstrument.Acoustic_Grand_Piano,
  35. "kontrabass": MidiInstrument.Contrabass,
  36. "oboe": MidiInstrument.Oboe,
  37. "organ": MidiInstrument.Church_Organ,
  38. "orgel": MidiInstrument.Church_Organ,
  39. "orgue": MidiInstrument.Church_Organ,
  40. "percussion": MidiInstrument.Percussion,
  41. "piano": MidiInstrument.Acoustic_Grand_Piano,
  42. "piccolo": MidiInstrument.Piccolo,
  43. "posaune": MidiInstrument.Trombone,
  44. "recorder": MidiInstrument.Recorder,
  45. "sax": MidiInstrument.Tenor_Sax,
  46. "schlagwerk": MidiInstrument.Percussion,
  47. "schlagzeug": MidiInstrument.Percussion,
  48. "sopran": MidiInstrument.Synth_Voice,
  49. "steeldrum": MidiInstrument.Steel_Drums,
  50. "streicher": MidiInstrument.String_Ensemble_1,
  51. "strings": MidiInstrument.String_Ensemble_1,
  52. "tenor": MidiInstrument.Synth_Voice,
  53. "tpt": MidiInstrument.Trumpet,
  54. "trombone": MidiInstrument.Trombone,
  55. "trompete": MidiInstrument.Trumpet,
  56. "trumpet": MidiInstrument.Trumpet,
  57. "tuba": MidiInstrument.Tuba,
  58. "unnamed": MidiInstrument.Acoustic_Grand_Piano,
  59. "viola": MidiInstrument.Viola,
  60. "violin": MidiInstrument.Violin,
  61. "violon-c": MidiInstrument.Cello,
  62. "violon.": MidiInstrument.Violin,
  63. "voice": MidiInstrument.Synth_Voice,
  64. "woodblock": MidiInstrument.Woodblock
  65. };
  66. public idString: string;
  67. public midiInstrumentID: MidiInstrument;
  68. public volume: number;
  69. public pan: number;
  70. public fixedKey: number;
  71. public name: string;
  72. private parentInstrument: Instrument;
  73. public get ParentInstrument(): Instrument {
  74. return this.parentInstrument;
  75. }
  76. public static isPianoInstrument(instrument: MidiInstrument): boolean {
  77. return (instrument === MidiInstrument.Acoustic_Grand_Piano
  78. || instrument === MidiInstrument.Bright_Acoustic_Piano
  79. || instrument === MidiInstrument.Electric_Grand_Piano
  80. || instrument === MidiInstrument.Electric_Piano_1
  81. || instrument === MidiInstrument.Electric_Piano_2);
  82. }
  83. public setMidiInstrument(instrumentType: string): void {
  84. this.midiInstrumentID = SubInstrument.midiInstrument[this.parseMidiInstrument(instrumentType)];
  85. }
  86. private parseMidiInstrument(instrumentType: string): string {
  87. // FIXME: test this function
  88. try {
  89. // find the best match for the given instrumentType:
  90. if (instrumentType) {
  91. const tmpName: string = instrumentType.toLowerCase().trim();
  92. for (const key in SubInstrument.midiInstrument) {
  93. if (tmpName.indexOf(key) !== -1) {
  94. return key;
  95. }
  96. }
  97. }
  98. // if the instrumentType didn't work, use the name:
  99. if (this.parentInstrument.Name) {
  100. const tmpName: string = this.parentInstrument.Name.toLowerCase().trim();
  101. for (const key in SubInstrument.midiInstrument) {
  102. if (tmpName.indexOf(key) !== -1) {
  103. return key;
  104. }
  105. }
  106. }
  107. } catch (e) {
  108. log.error("Error parsing MIDI Instrument. Default to Grand Piano.");
  109. }
  110. return "unnamed";
  111. }
  112. }