1:- module(mxml_portray, []).
8:- use_module(library(listutils), [rep/3]). 9:- use_module(library(mxml_chords), [ ivals_triad_exts/3 ]). 10
11user:portray(flat(X)) :- sign(flat,S), format('~w~p',[S,X]).
12user:portray(sharp(X)) :- sign(sharp,S), format('~w~p',[S,X]).
13user:portray(a(N,A)) :-
14 accidentals(A,Chars,Sep),
15 ( number(N)
16 -> format('~s~w~w', [Chars,Sep,N])
17 ; format('~w~s', [N,Chars])
18 ).
19
20user:portray(chord(R,B,Is)) :-
21 ivals_triad_exts(Is, Triad, Exts),
22 format('~p ~w', [R,Triad]),
23 maplist(space_print, Exts),
24 ( R=B -> true
25 ; write('/'), print(B)
26 ).
27
28space_print(X) :- format(' ~p',[X]).
29
30bip(N,N,sharp) :- N>0.
31bip(N,M,flat) :- N<0, M is -N.
32
33accidentals(0, [], '').
34accidentals(N, Chars, ' ') :- bip(N,M,S), sign(S,C), rep(M,C,Chars).
35
36sign(ascii, sharp, #).
37sign(ascii, flat, b).
38sign(uni, sharp, â¯).
39sign(uni, flat, â).
40sign(uni, natural, â®).
41sign(uni, double_flat, ð«).
42sign(uni, double_sharp, ðª).
43sign(uni, crotchet, â©).
44sign(uni, quaver, âª).
45sign(uni, two_quavers, â«).
46sign(uni, two_semiquavers, â¬).
47
48sign(Name,Char) :- sign(uni,Name,Char)
Provides pretty portrayal of notes and chords
Chords are portrayed as Root Triad [Extensions] [/Bass]. Alterables (ie things that can have sharps and flats) get nice Unicode sharps and flats. */