Stroke.java

1
package com.github.dakusui.symfonion.song;
2
3
import com.github.dakusui.json.*;
4
import com.github.dakusui.symfonion.core.MidiCompiler;
5
import com.github.dakusui.symfonion.core.MidiCompilerContext;
6
import com.github.dakusui.symfonion.exceptions.ExceptionThrower;
7
import com.github.dakusui.symfonion.exceptions.SymfonionException;
8
import com.github.dakusui.symfonion.exceptions.SymfonionIllegalFormatException;
9
import com.github.dakusui.symfonion.song.Pattern.Parameters;
10
import com.github.dakusui.symfonion.utils.Fraction;
11
import com.github.dakusui.symfonion.utils.Utils;
12
import com.google.gson.*;
13
14
import javax.sound.midi.InvalidMidiDataException;
15
import javax.sound.midi.MidiEvent;
16
import javax.sound.midi.Track;
17
import java.util.LinkedList;
18
import java.util.List;
19
import java.util.regex.Matcher;
20
21
import static com.github.dakusui.symfonion.exceptions.ExceptionThrower.*;
22
import static com.github.dakusui.symfonion.exceptions.ExceptionThrower.ContextKey.JSON_ELEMENT_ROOT;
23
import static com.github.dakusui.symfonion.exceptions.SymfonionIllegalFormatException.NOTE_LENGTH_EXAMPLE;
24
import static com.github.dakusui.symfonion.exceptions.SymfonionTypeMismatchException.PRIMITIVE;
25
26
public class Stroke {
27
  private static final int UNDEFINED_NUM = -1;
28
  private final Fraction length;
29
  static java.util.regex.Pattern notesPattern = java.util.regex.Pattern.compile("([A-Zac-z])([#b]*)([><]*)([\\+\\-]*)?");
30
  List<NoteSet> notes = new LinkedList<>();
31
  private final double gate;
32
  private final NoteMap noteMap;
33
  private final int[] volume;
34
  private final int[] pan;
35
  private final int[] reverb;
36
  private final int[] chorus;
37
  private final int[] pitch;
38
  private final int[] modulation;
39
  private final int pgno;
40
  private String bkno = null;
41
  private final int tempo;
42
  private final JsonArray sysex;
43
  private final int[] aftertouch;
44
  private final JsonElement strokeJson;
45
46
  public Stroke(JsonElement strokeJson, Parameters params, NoteMap noteMap) throws SymfonionException, JsonException {
47
    String notes;
48
    Fraction len = params.length();
49
    double gate = params.gate();
50
    this.strokeJson = strokeJson;
51
    JsonObject obj = JsonUtils.asJsonObjectWithPromotion(strokeJson, new String[]{
52
        Keyword.$notes.name(),
53
        Keyword.$length.name()
54
    });
55
    notes = JsonUtils.asStringWithDefault(obj, null, Keyword.$notes);
56 1 1. <init> : negated conditional → KILLED
    if (JsonUtils.hasPath(obj, Keyword.$length)) {
57
      JsonElement lenJSON = JsonUtils.asJsonElement(obj, Keyword.$length);
58 1 1. <init> : negated conditional → KILLED
      if (lenJSON.isJsonPrimitive()) {
59
        len = Utils.parseNoteLength(lenJSON.getAsString());
60 1 1. <init> : negated conditional → KILLED
        if (len == null) {
61
          throw illegalFormatException(lenJSON, NOTE_LENGTH_EXAMPLE);
62
        }
63
      } else {
64
        throw typeMismatchException(lenJSON, PRIMITIVE);
65
      }
66
    }
67 1 1. <init> : negated conditional → KILLED
    if (JsonUtils.hasPath(obj, Keyword.$gate)) {
68
      gate = JsonUtils.asDouble(obj, Keyword.$gate);
69
    }
70 1 1. <init> : negated conditional → KILLED
    this.tempo = JsonUtils.hasPath(obj, Keyword.$tempo) ? JsonUtils.asInt(obj, Keyword.$tempo) : UNDEFINED_NUM;
71 1 1. <init> : negated conditional → KILLED
    this.pgno = JsonUtils.hasPath(obj, Keyword.$program) ? JsonUtils.asInt(obj, Keyword.$program) : UNDEFINED_NUM;
72 1 1. <init> : negated conditional → KILLED
    if (JsonUtils.hasPath(obj, Keyword.$bank)) {
73
      this.bkno = JsonUtils.asString(obj, Keyword.$bank);
74
      // Checks if this.bkno can be parsed as a double value.
75
      assert this.bkno != null;
76
      //noinspection ResultOfMethodCallIgnored
77
      Double.parseDouble(this.bkno);
78
    }
79
    this.volume = getIntArray(obj, Keyword.$volume);
80
    this.pan = getIntArray(obj, Keyword.$pan);
81
    this.reverb = getIntArray(obj, Keyword.$reverb);
82
    this.chorus = getIntArray(obj, Keyword.$chorus);
83
    this.pitch = getIntArray(obj, Keyword.$pitch);
84
    this.modulation = getIntArray(obj, Keyword.$modulation);
85
    this.aftertouch = getIntArray(obj, Keyword.$aftertouch);
86
    this.sysex = JsonUtils.asJsonArrayWithDefault(obj, null, Keyword.$sysex);
87
    /*
88
     * } else {
89
     * // unsupported
90
     * }
91
     */
92
    this.noteMap = noteMap;
93
    this.gate = gate;
94
    Fraction strokeLen = Fraction.zero;
95 1 1. <init> : negated conditional → KILLED
    if (notes != null) {
96
      for (String nn : notes.split(";")) {
97
        NoteSet ns = new NoteSet();
98
        Fraction nsLen;
99
        String l;
100 1 1. <init> : negated conditional → KILLED
        if ((l = parseNotes(nn, ns)) != null) {
101
          nsLen = Utils.parseNoteLength(l);
102
        } else {
103
          nsLen = len;
104
        }
105 1 1. <init> : removed call to com/github/dakusui/symfonion/song/NoteSet::setLength → KILLED
        ns.setLength(nsLen);
106
        this.notes.add(ns);
107
        strokeLen = Fraction.add(strokeLen, nsLen);
108
      }
109
    }
110 1 1. <init> : negated conditional → KILLED
    if (Fraction.zero.equals(strokeLen)) {
111
      strokeLen = len;
112
    }
113
    this.length = strokeLen;
114
  }
115
116
  private int[] getIntArray(JsonObject cur, Keyword kw) throws JsonInvalidPathException, JsonTypeMismatchException, JsonFormatException {
117
    int[] ret;
118 1 1. getIntArray : negated conditional → KILLED
    if (!JsonUtils.hasPath(cur, kw)) {
119
      return null;
120
    }
121
    JsonElement json = JsonUtils.asJsonElement(cur, kw);
122 1 1. getIntArray : negated conditional → KILLED
    if (json.isJsonArray()) {
123
      JsonArray arr = json.getAsJsonArray();
124
      ret = interpolate(expandDots(arr));
125
    } else {
126
      ret = new int[1];
127
      ret[0] = JsonUtils.asInt(cur, kw);
128
    }
129 1 1. getIntArray : replaced return value with null for com/github/dakusui/symfonion/song/Stroke::getIntArray → KILLED
    return ret;
130
  }
131
132
  private static JsonArray expandDots(JsonArray arr) throws SymfonionIllegalFormatException {
133
    JsonArray ret = new JsonArray();
134 2 1. expandDots : negated conditional → KILLED
2. expandDots : changed conditional boundary → KILLED
    for (int i = 0; i < arr.size(); i++) {
135
      JsonElement cur = arr.get(i);
136 1 1. expandDots : negated conditional → KILLED
      if (cur.isJsonPrimitive()) {
137
        JsonPrimitive p = cur.getAsJsonPrimitive();
138 2 1. expandDots : negated conditional → KILLED
2. expandDots : negated conditional → KILLED
        if (p.isBoolean() || p.isNumber())
139 1 1. expandDots : removed call to com/google/gson/JsonArray::add → KILLED
          ret.add(p);
140 1 1. expandDots : negated conditional → KILLED
        else if (p.isString()) {
141
          String s = p.getAsString();
142 2 1. expandDots : changed conditional boundary → KILLED
2. expandDots : negated conditional → KILLED
          for (int j = 0; j < s.length(); j++) {
143 1 1. expandDots : negated conditional → KILLED
            if (s.charAt(j) == '.')
144 1 1. expandDots : removed call to com/google/gson/JsonArray::add → KILLED
              ret.add(JsonNull.INSTANCE);
145
            else
146
              throw syntaxErrorWhenExpandingDotsIn(arr);
147
          }
148
        }
149 1 1. expandDots : negated conditional → KILLED
      } else if (cur.isJsonNull())
150 1 1. expandDots : removed call to com/google/gson/JsonArray::add → KILLED
        ret.add(cur);
151
      else
152
        throw ExceptionThrower.typeMismatchWhenExpandingDotsIn(arr);
153
    }
154 1 1. expandDots : replaced return value with null for com/github/dakusui/symfonion/song/Stroke::expandDots → KILLED
    return ret;
155
  }
156
157
  private static int[] interpolate(JsonArray arr) {
158
    int[] ret;
159
    Integer[] tmp = new Integer[arr.size()];
160 2 1. interpolate : changed conditional boundary → KILLED
2. interpolate : negated conditional → KILLED
    for (int i = 0; i < tmp.length; i++) {
161 2 1. interpolate : negated conditional → KILLED
2. interpolate : negated conditional → KILLED
      if (arr.get(i) == null || arr.get(i).isJsonNull()) {
162
        tmp[i] = null;
163
      } else {
164
        tmp[i] = arr.get(i).getAsInt();
165
      }
166
    }
167
    ret = new int[arr.size()];
168
    int start = 0;
169
    int end = 0;
170 2 1. interpolate : negated conditional → KILLED
2. interpolate : changed conditional boundary → KILLED
    for (int i = 0; i < tmp.length; i++) {
171 1 1. interpolate : negated conditional → SURVIVED
      if (tmp[i] != null) {
172
        start = ret[i] = tmp[i];
173
      } else {
174 1 1. interpolate : Replaced integer addition with subtraction → TIMED_OUT
        int j = i + 1;
175 2 1. interpolate : changed conditional boundary → SURVIVED
2. interpolate : negated conditional → KILLED
        while (j < tmp.length) {
176 1 1. interpolate : negated conditional → KILLED
          if (tmp[j] != null) {
177
            end = tmp[j];
178
            ret[j] = end;
179
            break;
180
          }
181
          j++;
182
        }
183 3 1. interpolate : Replaced integer subtraction with addition → SURVIVED
2. interpolate : Replaced integer subtraction with addition → SURVIVED
3. interpolate : Replaced integer division with multiplication → KILLED
        int step = (end - start) / (j - i);
184
        int curval = start;
185 2 1. interpolate : changed conditional boundary → SURVIVED
2. interpolate : negated conditional → KILLED
        for (int k = i; k < j; k++) {
186 1 1. interpolate : Replaced integer addition with subtraction → KILLED
          curval += step;
187
          ret[k] = curval;
188
        }
189
        i = j;
190
      }
191
    }
192 1 1. interpolate : replaced return value with null for com/github/dakusui/symfonion/song/Stroke::interpolate → KILLED
    return ret;
193
  }
194
195
  public Fraction length() {
196 1 1. length : replaced return value with null for com/github/dakusui/symfonion/song/Stroke::length → KILLED
    return length;
197
  }
198
199
  public double gate() {
200 1 1. gate : replaced double return with 0.0d for com/github/dakusui/symfonion/song/Stroke::gate → KILLED
    return this.gate;
201
  }
202
203
  public List<NoteSet> noteSets() {
204 1 1. noteSets : replaced return value with Collections.emptyList for com/github/dakusui/symfonion/song/Stroke::noteSets → KILLED
    return this.notes;
205
  }
206
207
  /*
208
   * Returns the 'length' portion of the string <code>s</code>.
209
   */
210
  private String parseNotes(String s, List<Note> notes) throws SymfonionException {
211
    Matcher m = notesPattern.matcher(s);
212
    int i;
213 1 1. parseNotes : negated conditional → KILLED
    for (i = 0; m.find(i); i = m.end()) {
214 1 1. parseNotes : negated conditional → KILLED
      if (i != m.start()) {
215
        throw syntaxErrorInNotePattern(s, i, m);
216
      }
217
      int n_ = this.noteMap.note(m.group(1), this.strokeJson);
218 2 1. parseNotes : changed conditional boundary → SURVIVED
2. parseNotes : negated conditional → KILLED
      if (n_ >= 0) {
219
        int n =
220
            n_ +
221 2 1. parseNotes : Replaced integer subtraction with addition → SURVIVED
2. parseNotes : Replaced integer addition with subtraction → SURVIVED
                Utils.count('#', m.group(2)) - Utils.count('b', m.group(2)) +
222 4 1. parseNotes : Replaced integer multiplication with division → SURVIVED
2. parseNotes : Replaced integer subtraction with addition → SURVIVED
3. parseNotes : Replaced integer multiplication with division → SURVIVED
4. parseNotes : Replaced integer addition with subtraction → SURVIVED
                Utils.count('>', m.group(3)) * 12 - Utils.count('<', m.group(3)) * 12;
223 1 1. parseNotes : Replaced integer subtraction with addition → SURVIVED
        int a = Utils.count('+', m.group(4)) - Utils.count('-', m.group(4));
224
        Note nn = new Note(n, a);
225
        notes.add(nn);
226
      }
227
    }
228
    Matcher n = Utils.lengthPattern.matcher(s);
229
    String ret = null;
230 1 1. parseNotes : negated conditional → KILLED
    if (n.find(i)) {
231
      ret = s.substring(n.start(), n.end());
232
      i = n.end();
233
    }
234 1 1. parseNotes : negated conditional → KILLED
    if (i != s.length()) {
235
      String msg = s.substring(0, i) + "`" + s.substring(i) + "' isn't a valid note expression. Notes must be like 'C', 'CEG8.', and so on.";
236
      throw illegalFormatException(this.strokeJson, msg);
237
    }
238 1 1. parseNotes : replaced return value with "" for com/github/dakusui/symfonion/song/Stroke::parseNotes → KILLED
    return ret;
239
240
  }
241
242
  interface EventCreator {
243
    void createEvent(int v, long pos) throws InvalidMidiDataException;
244
  }
245
246
  private void renderValues(int[] values, long pos, long strokeLen, MidiCompiler compiler, EventCreator creator) throws
247
      InvalidMidiDataException {
248 1 1. renderValues : negated conditional → KILLED
    if (values == null) {
249
      return;
250
    }
251 1 1. renderValues : Replaced long division with multiplication → SURVIVED
    long step = strokeLen / values.length;
252 2 1. renderValues : negated conditional → KILLED
2. renderValues : changed conditional boundary → KILLED
    for (int i = 0; i < values.length; i++) {
253 3 1. renderValues : Replaced long addition with subtraction → SURVIVED
2. renderValues : Replaced long multiplication with division → KILLED
3. renderValues : removed call to com/github/dakusui/symfonion/song/Stroke$EventCreator::createEvent → KILLED
      creator.createEvent(values[i], pos + step * i);
254 1 1. renderValues : removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED
      compiler.controlEventProcessed();
255
    }
256
  }
257
258
  public void compile(final MidiCompiler compiler, MidiCompilerContext context) throws InvalidMidiDataException {
259
    final Track track = context.track();
260
    final int ch = context.channel();
261
    long absolutePosition = context.convertRelativePositionInStrokeToAbsolutePosition(Fraction.zero);
262
    long strokeLen = context.getStrokeLengthInTicks(this);
263 1 1. compile : negated conditional → KILLED
    if (tempo != UNDEFINED_NUM) {
264
      track.add(compiler.createTempoEvent(this.tempo, absolutePosition));
265 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → NO_COVERAGE
      compiler.controlEventProcessed();
266
    }
267 1 1. compile : negated conditional → KILLED
    if (bkno != null) {
268
      int msb = Integer.parseInt(bkno.substring(0, this.bkno.indexOf('.')));
269
      track.add(compiler.createBankSelectMSBEvent(ch, msb, absolutePosition));
270 1 1. compile : negated conditional → KILLED
      if (this.bkno.indexOf('.') != -1) {
271 1 1. compile : Replaced integer addition with subtraction → KILLED
        int lsb = Integer.parseInt(bkno.substring(this.bkno.indexOf('.') + 1));
272
        track.add(compiler.createBankSelectLSBEvent(ch, lsb, absolutePosition));
273
      }
274 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED
      compiler.controlEventProcessed();
275
    }
276 1 1. compile : negated conditional → KILLED
    if (pgno != UNDEFINED_NUM) {
277
      track.add(compiler.createProgramChangeEvent(ch, this.pgno, absolutePosition));
278 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED
      compiler.controlEventProcessed();
279
    }
280 1 1. compile : negated conditional → KILLED
    if (sysex != null) {
281
      MidiEvent ev = compiler.createSysexEvent(ch, sysex, absolutePosition);
282 1 1. compile : negated conditional → NO_COVERAGE
      if (ev != null) {
283
        track.add(ev);
284 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::sysexEventProcessed → NO_COVERAGE
        compiler.sysexEventProcessed();
285
      }
286
    }
287 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → KILLED
    renderValues(volume, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createVolumeChangeEvent(ch, v, pos)));
288 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(pan, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createPanChangeEvent(ch, v, pos)));
289 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(reverb, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createReverbEvent(ch, v, pos)));
290 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(chorus, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createChorusEvent(ch, v, pos)));
291 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(pitch, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createPitchBendEvent(ch, v, pos)));
292 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(modulation, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createModulationEvent(ch, v, pos)));
293 1 1. compile : removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED
    renderValues(aftertouch, absolutePosition, strokeLen, compiler, (v, pos) -> track.add(compiler.createAfterTouchChangeEvent(ch, v, pos)));
294
    int transpose = context.params().transpose();
295
    int arpegiodelay = context.params().arpegio();
296
    int delta = 0;
297
    Fraction relPosInStroke = Fraction.zero;
298
    for (NoteSet noteSet : this.noteSets()) {
299
      absolutePosition = context.convertRelativePositionInStrokeToAbsolutePosition(relPosInStroke);
300
      long absolutePositionWhereNoteFinishes = context.convertRelativePositionInStrokeToAbsolutePosition(
301
          Fraction.add(
302
              relPosInStroke,
303
              noteSet.getLength()
304
          )
305
      );
306 1 1. compile : Replaced long subtraction with addition → KILLED
      long noteLengthInTicks = absolutePositionWhereNoteFinishes - absolutePosition;
307
      for (Note note : noteSet) {
308 1 1. compile : Replaced integer addition with subtraction → SURVIVED
        int key = note.key() + transpose;
309
        int velocity = Math.max(
310
            0,
311
            Math.min(
312
                127,
313
                context.params().velocitybase() +
314 2 1. compile : Replaced integer multiplication with division → SURVIVED
2. compile : Replaced integer addition with subtraction → SURVIVED
                    note.accent() * context.params().velocitydelta() +
315 1 1. compile : Replaced integer addition with subtraction → SURVIVED
                    context.getGrooveAccent(relPosInStroke)
316
            )
317
        );
318 1 1. compile : Replaced long addition with subtraction → SURVIVED
        track.add(compiler.createNoteOnEvent(ch, key, velocity, absolutePosition + delta));
319 3 1. compile : Replaced long addition with subtraction → SURVIVED
2. compile : Replaced double addition with subtraction → KILLED
3. compile : Replaced double multiplication with division → KILLED
        track.add(compiler.createNoteOffEvent(ch, key, (long) (absolutePosition + delta + noteLengthInTicks * this.gate())));
320 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::noteProcessed → SURVIVED
        compiler.noteProcessed();
321 1 1. compile : Replaced integer addition with subtraction → SURVIVED
        delta += arpegiodelay;
322
      }
323 1 1. compile : removed call to com/github/dakusui/symfonion/core/MidiCompiler::noteSetProcessed → SURVIVED
      compiler.noteSetProcessed();
324
      relPosInStroke = Fraction.add(relPosInStroke, noteSet.getLength());
325
    }
326
  }
327
}

Mutations

56

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

58

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.InvalidDataErrorTest.illegalNoteLength_03(com.github.dakusui.symfonion.tests.InvalidDataErrorTest)
negated conditional → KILLED

60

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.InvalidDataErrorTest.illegalNoteLength_03(com.github.dakusui.symfonion.tests.InvalidDataErrorTest)
negated conditional → KILLED

67

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

70

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

71

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

72

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

95

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

100

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

105

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
removed call to com/github/dakusui/symfonion/song/NoteSet::setLength → KILLED

110

1.1
Location : <init>
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[6: POSITIVE: given: 'sixteen notes are given in two string elements' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

118

1.1
Location : getIntArray
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

122

1.1
Location : getIntArray
Killed by : com.github.dakusui.symfonion.tests.InvalidJsonErrorTest.missingSection_sequence(com.github.dakusui.symfonion.tests.InvalidJsonErrorTest)
negated conditional → KILLED

129

1.1
Location : getIntArray
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
replaced return value with null for com/github/dakusui/symfonion/song/Stroke::getIntArray → KILLED

134

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
changed conditional boundary → KILLED

136

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

138

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

139

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
removed call to com/google/gson/JsonArray::add → KILLED

140

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

142

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
changed conditional boundary → KILLED

2.2
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

143

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

144

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
removed call to com/google/gson/JsonArray::add → KILLED

149

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[10: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing nulls with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

150

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[10: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing nulls with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
removed call to com/google/gson/JsonArray::add → KILLED

154

1.1
Location : expandDots
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
replaced return value with null for com/github/dakusui/symfonion/song/Stroke::expandDots → KILLED

160

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
changed conditional boundary → KILLED

2.2
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

161

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

170

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
changed conditional boundary → KILLED

171

1.1
Location : interpolate
Killed by : none
negated conditional → SURVIVED

174

1.1
Location : interpolate
Killed by : none
Replaced integer addition with subtraction → TIMED_OUT

175

1.1
Location : interpolate
Killed by : none
changed conditional boundary → SURVIVED

2.2
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

176

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

183

1.1
Location : interpolate
Killed by : none
Replaced integer subtraction with addition → SURVIVED

2.2
Location : interpolate
Killed by : none
Replaced integer subtraction with addition → SURVIVED

3.3
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced integer division with multiplication → KILLED

185

1.1
Location : interpolate
Killed by : none
changed conditional boundary → SURVIVED

2.2
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

186

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[11: POSITIVE: given: 'a note and an 'arrayable' control (volume) with nulls' when: 'compile' then: 'arrayable control expanded replacing dots with intermediate values.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced integer addition with subtraction → KILLED

192

1.1
Location : interpolate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[9: POSITIVE: given: 'a note and an 'arrayable' control (volume)' when: 'compile' then: 'arrayable control expanded.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
replaced return value with null for com/github/dakusui/symfonion/song/Stroke::interpolate → KILLED

196

1.1
Location : length
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
replaced return value with null for com/github/dakusui/symfonion/song/Stroke::length → KILLED

200

1.1
Location : gate
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
replaced double return with 0.0d for com/github/dakusui/symfonion/song/Stroke::gate → KILLED

204

1.1
Location : noteSets
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
replaced return value with Collections.emptyList for com/github/dakusui/symfonion/song/Stroke::noteSets → KILLED

213

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

214

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

218

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : parseNotes
Killed by : none
changed conditional boundary → SURVIVED

221

1.1
Location : parseNotes
Killed by : none
Replaced integer subtraction with addition → SURVIVED

2.2
Location : parseNotes
Killed by : none
Replaced integer addition with subtraction → SURVIVED

222

1.1
Location : parseNotes
Killed by : none
Replaced integer multiplication with division → SURVIVED

2.2
Location : parseNotes
Killed by : none
Replaced integer subtraction with addition → SURVIVED

3.3
Location : parseNotes
Killed by : none
Replaced integer multiplication with division → SURVIVED

4.4
Location : parseNotes
Killed by : none
Replaced integer addition with subtraction → SURVIVED

223

1.1
Location : parseNotes
Killed by : none
Replaced integer subtraction with addition → SURVIVED

230

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

234

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
negated conditional → KILLED

238

1.1
Location : parseNotes
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.missingNote(com.github.dakusui.symfonion.tests.ReferenceErrorTest)
replaced return value with "" for com/github/dakusui/symfonion/song/Stroke::parseNotes → KILLED

248

1.1
Location : renderValues
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
negated conditional → KILLED

251

1.1
Location : renderValues
Killed by : none
Replaced long division with multiplication → SURVIVED

252

1.1
Location : renderValues
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

2.2
Location : renderValues
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
changed conditional boundary → KILLED

253

1.1
Location : renderValues
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced long multiplication with division → KILLED

2.2
Location : renderValues
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
removed call to com/github/dakusui/symfonion/song/Stroke$EventCreator::createEvent → KILLED

3.3
Location : renderValues
Killed by : none
Replaced long addition with subtraction → SURVIVED

254

1.1
Location : renderValues
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED

263

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

265

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → NO_COVERAGE

267

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
negated conditional → KILLED

270

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[3: POSITIVE: given: 'pattern contains note on, note off, program change, and bank change (LSB and MSB)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
negated conditional → KILLED

271

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[3: POSITIVE: given: 'pattern contains note on, note off, program change, and bank change (LSB and MSB)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced integer addition with subtraction → KILLED

274

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED

276

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
negated conditional → KILLED

278

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::controlEventProcessed → SURVIVED

280

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest.test(com.github.dakusui.symfonion.tests.cli.subcommands.CompileTest)
negated conditional → KILLED

282

1.1
Location : compile
Killed by : none
negated conditional → NO_COVERAGE

284

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::sysexEventProcessed → NO_COVERAGE

287

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[8: POSITIVE: given: 'a note and controls (program change, volume, pan, chorus, reverb, modulation, and pitch)' when: 'compile' then: 'note on/off, program change, and volume are included.'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → KILLED

288

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

289

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

290

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

291

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

292

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

293

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/song/Stroke::renderValues → SURVIVED

306

1.1
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[6: POSITIVE: given: 'sixteen notes are given in two string elements' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced long subtraction with addition → KILLED

308

1.1
Location : compile
Killed by : none
Replaced integer addition with subtraction → SURVIVED

314

1.1
Location : compile
Killed by : none
Replaced integer multiplication with division → SURVIVED

2.2
Location : compile
Killed by : none
Replaced integer addition with subtraction → SURVIVED

315

1.1
Location : compile
Killed by : none
Replaced integer addition with subtraction → SURVIVED

318

1.1
Location : compile
Killed by : none
Replaced long addition with subtraction → SURVIVED

319

1.1
Location : compile
Killed by : none
Replaced long addition with subtraction → SURVIVED

2.2
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced double addition with subtraction → KILLED

3.3
Location : compile
Killed by : com.github.dakusui.symfonion.tests.MidiCompilerTest.exercise[7: POSITIVE: given: 'sixteenth note with short gate (0.25)' when: 'compile' then: 'number of events and tick length seem ok'](com.github.dakusui.symfonion.tests.MidiCompilerTest)
Replaced double multiplication with division → KILLED

320

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::noteProcessed → SURVIVED

321

1.1
Location : compile
Killed by : none
Replaced integer addition with subtraction → SURVIVED

323

1.1
Location : compile
Killed by : none
removed call to com/github/dakusui/symfonion/core/MidiCompiler::noteSetProcessed → SURVIVED

Active mutators

Tests examined


Report generated by PIT 1.15.3