File: lyparserfuncs.c

package info (click to toggle)
denemo 0.5.9-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,500 kB
  • ctags: 2,415
  • sloc: ansic: 23,057; sh: 3,321; yacc: 1,737; makefile: 449; lex: 376
file content (185 lines) | stat: -rw-r--r-- 4,494 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/* lyparserfuncs.c
 * utility functions invoked by the
 * mudela parser */

/* For Denemo, a gtk+ frontend to GNU Lilypond
 * (c) 2000, 2001 Matthew Hiller */

#include "chordops.h"
#include "datastructures.h"
#include "lyparserfuncs.h"
#include "objops.h"
#include "processstaffname.h"
#include "utils.h"

void
setstaffname (struct scoreinfo *si, gchar * str)
{
  staff *curstaffstruct = si->currentstaff->data;

  g_string_assign (curstaffstruct->lily_name, str);
  set_denemo_name (curstaffstruct->lily_name, curstaffstruct->denemo_name);
  g_free (str);
}

gint cleftypefromname (gchar * str)
{
  gint ret;

  if (g_strcasecmp (str, "treble") == 0)
    ret = TREBLE;
  else if (g_strcasecmp (str, "bass") == 0)
    ret = BASS;
  else if (g_strcasecmp (str, "alto") == 0)
    ret = ALTO;
  else if (g_strcasecmp (str, "\"g_8\"") == 0)
    ret = G_8;
  else if (g_strcasecmp (str, "tenor") == 0)
    ret = TENOR;
  else if (g_strcasecmp (str, "soprano") == 0)
    ret = SOPRANO;
  g_free (str);
  return ret;
}

void
setclef (struct scoreinfo *si, gchar * str)
{
  ((staff *) si->currentstaff->data)->sclef = cleftypefromname (str);
}

void
setkey (struct scoreinfo *si, struct twoints t)
{
  staff *curstaffstruct = si->currentstaff->data;

  if (t.b)
    {				/* Minor key  */
      curstaffstruct->skey = t.a - 3;
      curstaffstruct->skey_isminor = TRUE;
    }
  else
    {
      curstaffstruct->skey = t.a;
      curstaffstruct->skey_isminor = FALSE;
    }
  initkeyaccs (curstaffstruct->skeyaccs, curstaffstruct->skey);
}

void
settime (struct scoreinfo *si, struct twoints t)
{
  staff *curstaffstruct = si->currentstaff->data;

  curstaffstruct->stime1 = t.a;
  curstaffstruct->stime2 = t.b;
}

struct twoints
twointer (gint a, gint b)
{
  struct twoints ret;

  ret.a = a;
  ret.b = b;
  return ret;
}

/* This is basically the inverse to determinekey in
 * exportmudela.c */

gint keynametonumber (gchar * str)
{
  if (g_strcasecmp (str, "ces") == 0)
    return -7;
  else if (g_strcasecmp (str, "ges") == 0)
    return -6;
  else if (g_strcasecmp (str, "des") == 0)
    return -5;
  else if (g_strcasecmp (str, "aes") == 0)
    return -4;
  else if (g_strcasecmp (str, "ees") == 0)
    return -3;
  else if (g_strcasecmp (str, "bes") == 0)
    return -2;
  else if (g_strcasecmp (str, "f") == 0)
    return -1;
  else if (g_strcasecmp (str, "c") == 0)
    return 0;
  else if (g_strcasecmp (str, "g") == 0)
    return 1;
  else if (g_strcasecmp (str, "d") == 0)
    return 2;
  else if (g_strcasecmp (str, "a") == 0)
    return 3;
  else if (g_strcasecmp (str, "e") == 0)
    return 4;
  else if (g_strcasecmp (str, "b") == 0)
    return 5;
  else if (g_strcasecmp (str, "fis") == 0)
    return 6;
  else if (g_strcasecmp (str, "cis") == 0)
    return 7;
  else if (g_strcasecmp (str, "gis") == 0)
    return 8;
  else if (g_strcasecmp (str, "dis") == 0)
    return 9;
  else if (g_strcasecmp (str, "ais") == 0)
    return 10;
  else
    return 0;			/* Defaults to c minor/major */
  g_free (str);
}

gint mutointernalduration (gint muduration)
{
  gint ret = 0;

  while (muduration > 1)
    {
      ret++;
      muduration >>= 1;
    }
  return ret;
}

gint pitchtomid_c_offset (gchar name, gint octave)
{
  return 7 * (octave - 1) + (name - 'a' + 5) % 7;
}

void
addtonewrapper (mudelaobject * curmudelaobj, gchar tonetype,
		gint enshift, gint octave, struct twoints duration,
		gint dclef)
{
  gint mid_c_offset = pitchtomid_c_offset (tonetype, octave);

  if (tonetype != 'r')
    addtone (curmudelaobj, mid_c_offset, enshift, dclef);
  curmudelaobj->u.chordval.baseduration = duration.a;
  curmudelaobj->u.chordval.numdots = duration.b;
  set_basic_numticks (curmudelaobj);
}

void
set_tone_option (mudelaobject * curmudelaobj, gchar * option)
{

  if (!strcmp (option, "fermata"))
    curmudelaobj->u.chordval.has_fermata_p = TRUE;
  else if (!strcmp (option, "trill"))
    curmudelaobj->u.chordval.has_trill_p = TRUE;
  else if (!strcmp (option, "turn"))
    curmudelaobj->u.chordval.has_turn_p = TRUE;
  else if (!strcmp (option, "mordent"))
    curmudelaobj->u.chordval.has_mordent_p = TRUE;
  else if (!strcmp (option, "accent"))
    curmudelaobj->u.chordval.is_accented_p = TRUE;
  else if (!strcmp (option, "staccato"))
    curmudelaobj->u.chordval.has_stacatto_p = TRUE;
  else if (!strcmp (option, "staccatissimo"))
    curmudelaobj->u.chordval.has_staccatissimo_p = TRUE;
  else if (!strcmp (option, "tenuto"))
    curmudelaobj->u.chordval.has_tenuto_p = TRUE;
}