22
33import com .google .common .collect .ArrayListMultimap ;
44import com .google .common .collect .ListMultimap ;
5+ import de .saar .coli .arranger .abc .AbcParser ;
6+ import de .saar .coli .arranger .abc .AbcWriter ;
57
68import java .io .FileReader ;
79import java .io .FileWriter ;
810import java .io .IOException ;
11+ import java .io .InputStreamReader ;
912import java .util .*;
1013
1114public class Arrange {
15+ private Config config ;
16+
1217 private static final VoicePart [] VOICE_PARTS = new VoicePart []{
1318 new VoicePart ("Tenor" , Note .create ("G3" , 0 ), Note .create ("B4" , 0 )),
1419 new VoicePart ("Lead" , Note .create ("C3" , 0 ), Note .create ("G4" , 0 )),
@@ -18,26 +23,17 @@ public class Arrange {
1823
1924 private static final int TENOR = 0 , LEAD = 1 , BARI = 2 , BASS = 3 ;
2025
26+ public Arrange (Config config ) {
27+ this .config = config ;
28+ }
29+
2130 public static void main (String [] args ) throws IOException , AbcParser .AbcParsingException {
31+ Config config = Config .read (new InputStreamReader (Arrange .class .getResourceAsStream ("/config.yaml" )));
2232 Score score = new AbcParser ().read (new FileReader ("down_our_way.abc" ));
2333
24- // print score
25- score .foreachNoteAndChord (LEAD , (note , chord ) -> {
26- StringBuilder buf = new StringBuilder ();
27-
28- for (int chordNote : chord .getNotes ()) {
29- buf .append (Note .getNoteName (chordNote ));
30- buf .append (" " );
31- }
32-
33- // System.out.printf("%s %s -> %s\n", note, chord, buf.toString());
34- });
35-
36- Arrange arranger = new Arrange ();
34+ Arrange arranger = new Arrange (config );
3735 Score bestArrangedScore = arranger .arrange (score );
3836
39- // System.out.println(bestArrangedScore);
40-
4137 AbcWriter abcw = new AbcWriter ();
4238 FileWriter fw = new FileWriter ("arranged.abc" );
4339 abcw .write (bestArrangedScore , fw );
@@ -46,25 +42,16 @@ public static void main(String[] args) throws IOException, AbcParser.AbcParsingE
4642 }
4743
4844 private Score arrange (Score score ) {
49- List <List <List <Note >>> possibleNotes = computePossibleNotes (score );
50- // for (List<List<Note>> notesAtTime : possibleNotes) {
51- // System.out.println();
52- // System.out.println("Tn: " + notesAtTime.get(TENOR));
53- // System.out.println("Ld: " + notesAtTime.get(LEAD));
54- // System.out.println("Br: " + notesAtTime.get(BARI));
55- // System.out.println("Bs: " + notesAtTime.get(BASS));
56- // }
57-
5845 int n = score .countNotes (LEAD );
46+
47+ List <List <List <Note >>> possibleNotes = computePossibleNotes (score );
5948 assert n == possibleNotes .size ();
6049
6150 Map <Item , Integer > bestScores = new HashMap <>();
6251 BackpointerColumn backpointers = new BackpointerColumn (null );
6352 int time = 0 ;
6453
6554 for (int pos = 0 ; pos < n ; pos ++) {
66- // System.err.printf("Processing position %d ...\n", pos);
67-
6855 List <List <Note >> notesHere = possibleNotes .get (pos );
6956 Chord chordHere = score .getChordAtTime (time );
7057
@@ -147,9 +134,8 @@ public ListMultimap<Item, Backpointer> getBackpointers() {
147134
148135 private Score extractBestScore (Item bestFinalItem , BackpointerColumn backpointers , Score originalScore ) {
149136 List <Note []> notes = new ArrayList <>();
150- Item item = bestFinalItem ;
151137
152- // System.err.printf("[%03d] %s\n", notes.size(), item) ;
138+ Item item = bestFinalItem ;
153139 notes .add (item .lastNotes );
154140
155141 while (backpointers != null ) {
@@ -161,7 +147,7 @@ private Score extractBestScore(Item bestFinalItem, BackpointerColumn backpointer
161147 break ;
162148 } else {
163149 item = bp .getPreviousItem ();
164- System .err .printf ("[%03d] %s\n " , notes .size (), item );
150+ // System.err.printf("[%03d] %s\n", notes.size(), item);
165151 notes .add (item .lastNotes );
166152
167153 backpointers = backpointers .getPrevious ();
@@ -172,7 +158,7 @@ private Score extractBestScore(Item bestFinalItem, BackpointerColumn backpointer
172158
173159 Score ret = new Score ();
174160 ret .setTitle (originalScore .getTitle ());
175- ret .setComposer ("AK arranger" );
161+ ret .setComposer (config . getArranger () );
176162 ret .setKey (originalScore .getKey ());
177163 ret .setQuartersPerMeasure (originalScore .getQuartersPerMeasure ());
178164 ret .setLyrics (originalScore .getLyrics ());
@@ -197,7 +183,7 @@ private int scoreTransition(Note[] from, Note[] to) {
197183 for (int part = 0 ; part < 4 ; part ++) {
198184 if (part == TENOR || part == BARI ) {
199185 if (from [part ].getAbsoluteDistance (to [part ]) > 3 ) {
200- score -= 20 ;
186+ score += config . getScores (). getHarmonyJumps () ;
201187 }
202188 }
203189 }
@@ -207,7 +193,7 @@ private int scoreTransition(Note[] from, Note[] to) {
207193 for (int other = part + 1 ; other < 4 ; other ++) {
208194 if (from [part ].getAbsoluteDistance (from [other ]) == 12 ) {
209195 if (to [part ].getAbsoluteDistance (to [other ]) == 12 ) {
210- score -= 20 ;
196+ score += config . getScores (). getParallelOctaves () ;
211197 }
212198 }
213199 }
@@ -227,7 +213,7 @@ private int scoreLexicalChord(Note tn, Note ld, Note br, Note bs, Chord chord) {
227213
228214 // Tn likes to be highest note
229215 if (tn .getAbsoluteNote () < ld .getAbsoluteNote () || tn .getAbsoluteNote () < br .getAbsoluteNote ()) {
230- score -= 10 ;
216+ score += config . getScores (). getTenorCrossing () ;
231217 }
232218
233219 // Bs really wants to be lowest note
@@ -239,14 +225,14 @@ private int scoreLexicalChord(Note tn, Note ld, Note br, Note bs, Chord chord) {
239225 // disprefer unison
240226 Set <Integer > differentAbsoluteNotes = new HashSet <>(List .of (tn .getAbsoluteNote (), ld .getAbsoluteNote (), br .getAbsoluteNote (), bs .getAbsoluteNote ()));
241227 if (differentAbsoluteNotes .size () < 4 ) {
242- score -= 50 ;
228+ score += config . getScores (). getUnisonNotes () ;
243229 }
244230
245231 // disprefer very wide spread
246232 int highest = Collections .max (differentAbsoluteNotes );
247233 int lowest = Collections .min (differentAbsoluteNotes );
248- if (highest - lowest > 19 ) { // octave + third
249- score -= 20 ;
234+ if (highest - lowest > 19 ) { // octave + fifth
235+ score += config . getScores (). getWideSpread () ;
250236 }
251237
252238 return score ;
0 commit comments