1 | <?xml version="1.0" encoding="UTF-8"?>
|
---|
2 | <CollectionConfig xmlns:gsf="http://www.greenstone.org/greenstone3/schema/ConfigFormat" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
---|
3 | <metadataList>
|
---|
4 | <metadata lang="en" name="creator"></metadata>
|
---|
5 | <metadata lang="en" name="maintainer"></metadata>
|
---|
6 | <metadata lang="en" name="public">true</metadata>
|
---|
7 | </metadataList>
|
---|
8 | <displayItemList>
|
---|
9 | <displayItem assigned="true" lang="en" name="name">MARS Recommender</displayItem>
|
---|
10 | <displayItem assigned="true" lang="en" name="description">
|
---|
11 |
|
---|
12 | <!--
|
---|
13 | <div style="color: #000;">
|
---|
14 | <h4>
|
---|
15 | Explore Australian Music!: The Australian Music Centre Interactive Music Affect Recommender System (MARS)
|
---|
16 | </h4>
|
---|
17 | <h4>
|
---|
18 | <i>
|
---|
19 | Developed by David Bainbridge (Waikato University),
|
---|
20 | and Roger Dean (Western Sydney University).
|
---|
21 | </i>
|
---|
22 | </h4>
|
---|
23 | </div>
|
---|
24 | -->
|
---|
25 |
|
---|
26 | <h4>Overview</h4>
|
---|
27 | <p>
|
---|
28 | This content analysis enhanced digital library collection is
|
---|
29 | comprised of 9960 audio files from the
|
---|
30 | <a href="https://www.australianmusiccentre.com.au/">
|
---|
31 | Australian Music Centre</a>, an organisation
|
---|
32 | which hosts music and sound art from the country's
|
---|
33 | leading contemporary classical, improvisatory and experimental
|
---|
34 | composers.
|
---|
35 | Through this digital library you can use traditional text-based
|
---|
36 | searching and browsing to locate content.
|
---|
37 | <!--
|
---|
38 | You can also try
|
---|
39 | out our experimental arousal-valence based music recommender.
|
---|
40 | -->
|
---|
41 | You can also try out our interactive music affect-based
|
---|
42 | recommender. This will help you to experience more of the
|
---|
43 | musical nuances as a piece progresses, and provide you with
|
---|
44 | a range of possible recommendations for further listening,
|
---|
45 | based, if you choose, on your reactions.
|
---|
46 |
|
---|
47 |
|
---|
48 | </p>
|
---|
49 |
|
---|
50 |
|
---|
51 | <h4>How to use the Music Affect Recommender system</h4>
|
---|
52 |
|
---|
53 | <p>
|
---|
54 | Below the spectrogram there are several possible ways of
|
---|
55 | requesting recommendations of further pieces for you to listen
|
---|
56 | to:
|
---|
57 | </p>
|
---|
58 | <style>
|
---|
59 | ul.about-text li {
|
---|
60 | padding-top: 0.5rem;
|
---|
61 | }
|
---|
62 | </style>
|
---|
63 | <ul class="about-text">
|
---|
64 | <li>
|
---|
65 | First: based on your current timeline position, you can use the
|
---|
66 | âsimilar to the current spot' button to get suggestions.
|
---|
67 | </li>
|
---|
68 | <!--
|
---|
69 | â â
|
---|
70 | â â
|
---|
71 | -->
|
---|
72 | <li>
|
---|
73 | Second: if you âReturn to startâ then you can choose the âsimilar to current pieceâ button to get suggestions
|
---|
74 | </li>
|
---|
75 |
|
---|
76 | <li>
|
---|
77 | Third: you can use âvery different from the current pieceâ to get suggestions.
|
---|
78 | </li>
|
---|
79 |
|
---|
80 | <li>
|
---|
81 | Fourth: click the âLabelled AV (arousal-valence) chartâ and view the 2D circular
|
---|
82 | representation of different arousal and valence combinations. Choose one spot in it,
|
---|
83 | and new recommendations based on this spot will be presented.
|
---|
84 | </li>
|
---|
85 | <li>
|
---|
86 | <p>
|
---|
87 | Fifth and perhaps most interesting: click the *Personalise the AV experience* button, and play the piece through while indicating your perception of the AV it expresses. Arousal is a scale for how active you find the piece to be at the time, from negative (i.e. very passive, static) to positive (i.e. very active, dynamic). Valence is a scale of liking, from degrees of negative (dislike) to those of positive (like).
|
---|
88 | </p>
|
---|
89 | <p>
|
---|
90 | If you reach the end of the extract, then you can save your AV âtrailâ and it will inform future recommendations by adjusting the pre-existing machine learned predictions. Now if you click the âbased on the start of the current pieceâ your AV trail for it influences the recommendations.
|
---|
91 | </p>
|
---|
92 |
|
---|
93 | <!--
|
---|
94 | **********Currently when someone records an AV trail, the white AV bar remains on the spectrogram. Could it just be a plain bar, as there is on the waveform?? Or even better perhaps switch to the waveform display, on the grounds that the nice colour palette of the spectrogram might influence the AV responses too??
|
---|
95 | -->
|
---|
96 | <p>
|
---|
97 | Your AV trails also influence the recommendations cumulatively.
|
---|
98 | </p>
|
---|
99 | </li>
|
---|
100 | </ul>
|
---|
101 |
|
---|
102 |
|
---|
103 |
|
---|
104 | <h4>Technical Background</h4>
|
---|
105 | <p>
|
---|
106 | Using the <a href="https://essentia.upf.edu/documentation/">Essentia</a>
|
---|
107 | Digital Signal Processing library, a range of audio features are computed. This is
|
---|
108 | combined with the
|
---|
109 | <a href="http://cvml.unige.ch/databases/DEAM/">media-eval
|
---|
110 | Database for Emotional Analysis of Music</a> dataset to
|
---|
111 | produce a Machine Learning model to predict levels of arousal
|
---|
112 | and valence that a section of music evokes. We have chosen
|
---|
113 | REPTree for the predictive modeling, a fast decision tree
|
---|
114 | learner that exploits gain/variance and pruning (with
|
---|
115 | back-fitting) to build a regression tree.
|
---|
116 | </p>
|
---|
117 |
|
---|
118 | <p>
|
---|
119 | Next, we have taken this modeling capability and woven it
|
---|
120 | into the <a href="https://greenstone.org">Greenstone3</a>
|
---|
121 | Digital Library software architecture. The act of building
|
---|
122 | the digital library triggers the computation of the audio
|
---|
123 | features, which are then used to predict arousal and valence (AV)
|
---|
124 | features throughout each audio file. The analysis is currently set to using
|
---|
125 | a window of 6 seconds and an overlap of 50%. This is stored
|
---|
126 | as metadata within the built digital library, alongside
|
---|
127 | the more regular metadata values for title and artist.
|
---|
128 | </p>
|
---|
129 |
|
---|
130 |
|
---|
131 | <p>Finally, using
|
---|
132 | Greenstone3's <a href="https://files.greenstone.org/technical/gs3design.pdf">extensible
|
---|
133 | service-based architecture</a> we have enriched the user's
|
---|
134 | experience of listening to a work in the digital library
|
---|
135 | collection. The most prominent feature is a display of the
|
---|
136 | audio features of the work, in the form of either a frequency
|
---|
137 | spectrogram or waveform, with a timeline bar that moves through
|
---|
138 | the work as it is played. If you listen while viewing the
|
---|
139 | frequency spectrogram, then the timeline bar visually shows the
|
---|
140 | computed level of arousal by broadening the width of the
|
---|
141 | timeline bar as the level of arousal rises. The timeline bar is
|
---|
142 | rendered in white, varying the brightness used to reflect the
|
---|
143 | computed level of valence.
|
---|
144 | </p>
|
---|
145 |
|
---|
146 | <p>
|
---|
147 | Below the audio visualization, is a <i>Recommend</i>
|
---|
148 | button. If a user clicks on this, thenâagain leveraging the
|
---|
149 | service-based architecture to the digital library softwareâthe
|
---|
150 | computed values of arousal and valence for the passage of work being
|
---|
151 | played are used to select other works in the digital library
|
---|
152 | collection that share similar values.
|
---|
153 | These are added at the bottom of
|
---|
154 | the page as recommendations that the user might also like
|
---|
155 | to listen to.
|
---|
156 | </p>
|
---|
157 |
|
---|
158 | <!--
|
---|
159 | <p>
|
---|
160 | This collection shows the capabilities of the
|
---|
161 | <a href="https://essentia.upf.edu/documentation/">Essentia</a> DSP library
|
---|
162 | in combination with Greenstone3, based on the
|
---|
163 | 9960 MP3 files from
|
---|
164 | <a href="https://www.australianmusiccentre.com.au/">Australian Music Centre</a>
|
---|
165 | </p>
|
---|
166 |
|
---|
167 | <p>
|
---|
168 | When the digital library collection is built, Essentia is used to compute
|
---|
169 | a range of audio fetures commonly use in Music Information Retrieval (MIR) for
|
---|
170 | content analysis based techniques. These features are bound to
|
---|
171 | the document in the digital library correspondig to the source MP3 file.
|
---|
172 | </p>
|
---|
173 | -->
|
---|
174 |
|
---|
175 | </displayItem>
|
---|
176 | </displayItemList>
|
---|
177 | <search type="lucene">
|
---|
178 | <level name="document">
|
---|
179 | <displayItem lang="en" name="name">document</displayItem>
|
---|
180 | </level>
|
---|
181 | <!--
|
---|
182 | <level name="section">
|
---|
183 | <displayItem lang="en" name="name">section</displayItem>
|
---|
184 | </level>
|
---|
185 | -->
|
---|
186 | <defaultLevel name="document"/>
|
---|
187 | <index name="dc.Title,dc.Creator,amc.title,amc.artist">
|
---|
188 | <displayItem lang="en" name="name">all fields</displayItem>
|
---|
189 | </index>
|
---|
190 | <index name="dc.Title,amc.title">
|
---|
191 | <displayItem lang="en" name="name">titles</displayItem>
|
---|
192 | </index>
|
---|
193 | <index name="dc.Creator,amc.artist">
|
---|
194 | <displayItem lang="en" name="name">artists</displayItem>
|
---|
195 | </index>
|
---|
196 | <defaultIndex name="dc.Title,dc.Creator,amc.title,amc.artist"/>
|
---|
197 | <searchType name="plain"/>
|
---|
198 | <searchType name="simpleform"/>
|
---|
199 | <searchType name="advancedform"/>
|
---|
200 | <format>
|
---|
201 | <gsf:template match="documentNode">
|
---|
202 |
|
---|
203 | <xsl:choose>
|
---|
204 | <xsl:when test="/page/pageResponse/service/@name = 'AudioQuery'">
|
---|
205 |
|
---|
206 | <gsf:variable name="frameOffset">
|
---|
207 | <xsl:value-of select="@frameOffset"/>
|
---|
208 | </gsf:variable>
|
---|
209 | <gsf:variable name="rank">
|
---|
210 | <xsl:value-of select="@rank"/>
|
---|
211 | </gsf:variable>
|
---|
212 |
|
---|
213 | <td valign="top">
|
---|
214 | <gsf:icon type="document"/>
|
---|
215 | </td>
|
---|
216 | <td>
|
---|
217 |
|
---|
218 | <a class="AVRecommendation">
|
---|
219 | <xsl:choose>
|
---|
220 | <xsl:when test="/page/pageResponse/collection/@name">
|
---|
221 | <xsl:attribute name="href"><xsl:value-of select="$library_name"/>?a=d&c=<xsl:value-of select="/page/pageResponse/collection/@name"/>&d=<xsl:value-of select="@nodeID"/>&dt=<xsl:value-of select="@docType"/>&p.frameOffset=<xsl:value-of select="@frameOffset"/>&p.a=q&p.s=<xsl:value-of select="/page/pageResponse/service/@name"/>&hl=on&ed=1#<xsl:value-of select="@nodeID"/></xsl:attribute>
|
---|
222 | </xsl:when>
|
---|
223 | <xsl:when test="@collection">
|
---|
224 | <xsl:attribute name="href"><xsl:value-of select="$library_name"/>?a=d&c=<xsl:value-of select="@collection"/>&d=<xsl:value-of select="@nodeID"/>&dt=<xsl:value-of select="@docType"/>p.frameOffset=<xsl:value-of select="@frameOffset"/>&p.a=q&p.s=<xsl:value-of select="/page/pageResponse/service/@name"/>&hl=on&ed=1#<xsl:value-of select="@nodeID"/></xsl:attribute>
|
---|
225 | </xsl:when>
|
---|
226 | </xsl:choose>
|
---|
227 | <xsl:attribute name="data-arousalval"><xsl:value-of select="@arousalVal"/></xsl:attribute>
|
---|
228 | <xsl:attribute name="data-valenceval"><xsl:value-of select="@valenceVal"/></xsl:attribute>
|
---|
229 | <xsl:attribute name="data-frameoffset"><xsl:value-of select="@frameOffset"/></xsl:attribute>
|
---|
230 |
|
---|
231 | <gsf:metadata name="amc.title"/>
|
---|
232 | by <gsf:metadata name="amc.artist"/>
|
---|
233 | </a>
|
---|
234 |
|
---|
235 | <span style="font-style: italics; font-size: 100%" >
|
---|
236 | (Matching offset @ <xsl:value-of select="@frameOffset"/> secs)
|
---|
237 | </span>
|
---|
238 |
|
---|
239 | </td>
|
---|
240 | </xsl:when>
|
---|
241 | <xsl:otherwise>
|
---|
242 | <td valign="top">
|
---|
243 | <gsf:link type="document" extraLinkArgs="renderWave=0">
|
---|
244 | <gsf:icon type="document"/>
|
---|
245 | </gsf:link>
|
---|
246 | </td>
|
---|
247 | <td>
|
---|
248 |
|
---|
249 | <gsf:link type="document" extraLinkArgs="renderWave=0">
|
---|
250 | <gsf:metadata name="amc.title"/>
|
---|
251 | by <gsf:metadata name="amc.artist"/>
|
---|
252 | </gsf:link>
|
---|
253 | <!--
|
---|
254 | <gsf:switch>
|
---|
255 | <gsf:metadata name="Title" select="ancestors" separator=": "/>
|
---|
256 | <gsf:when test="exists">
|
---|
257 | <gsf:metadata name="Title" select="ancestors" separator=": "/>:
|
---|
258 | </gsf:when>
|
---|
259 | </gsf:switch>
|
---|
260 | <gsf:link type="document">
|
---|
261 | <gsf:metadata name="Title"/>
|
---|
262 | </gsf:link>
|
---|
263 | -->
|
---|
264 | </td>
|
---|
265 | </xsl:otherwise>
|
---|
266 | </xsl:choose>
|
---|
267 |
|
---|
268 | <!--
|
---|
269 | <xsl:if test="/page/pageResponse/service/@name = 'AudioQuery'">
|
---|
270 | <span style="font-style: italics; font-size: 90%" >
|
---|
271 | Matching offset @
|
---|
272 | <script>
|
---|
273 | <xsl:text disable-output-escaping="yes">
|
---|
274 | var frameOffsetStr="</xsl:text><xsl:value-of select="@frameOffset"/><xsl:text disable-output-escaping="yes">";
|
---|
275 | var frameOffsetList = frameOffsetStr.split(",");
|
---|
276 | for(i=0; i < frameOffsetList.length; i++) {
|
---|
277 | var frameOffset = frameOffsetList[i];
|
---|
278 | var offsetInSecs=(250*frameOffset)/1000.0;
|
---|
279 | if (i > 0) { document.write(", "); }
|
---|
280 | document.write(offsetInSecs.toFixed(2));
|
---|
281 | }
|
---|
282 | </xsl:text>
|
---|
283 | </script> secs
|
---|
284 | </span>
|
---|
285 | </xsl:if>
|
---|
286 |
|
---|
287 | -->
|
---|
288 | </gsf:template>
|
---|
289 | </format>
|
---|
290 | </search>
|
---|
291 |
|
---|
292 | <!--
|
---|
293 | <search type="wekaDB" orthogonal="true" />
|
---|
294 | -->
|
---|
295 |
|
---|
296 | <search type="wekaDB" orthogonal="true" serviceRack="GS2WekaDBSearch" />
|
---|
297 |
|
---|
298 | <!--
|
---|
299 | <search type="wekaDB" orthogonal="true" serviceRack="GS2WekaAVRecommender" />
|
---|
300 |
|
---|
301 | <search type="wekaAVFeatures" orthogonal="true" serviceRack="GS2WekaAVRecommender" />
|
---|
302 | -->
|
---|
303 |
|
---|
304 | <infodb type="jdbm"/>
|
---|
305 |
|
---|
306 | <import>
|
---|
307 | <pluginList>
|
---|
308 | <plugin name="ZIPPlugin"/>
|
---|
309 | <plugin name="GreenstoneXMLPlugin"/>
|
---|
310 |
|
---|
311 | <plugin name="EmbeddedMetadataPlugin"/>
|
---|
312 | <plugin name="AMCMetadataJSONPlugin"/>
|
---|
313 |
|
---|
314 | <plugin name="EssentiaPlugin">
|
---|
315 | <option name="-block_exp" value=".*\.csv$"/>
|
---|
316 | <!--
|
---|
317 | <option name="-compute_mir_features" value="true"/>
|
---|
318 | -->
|
---|
319 |
|
---|
320 | <option name="-compute_essentia_features" value="true"/>
|
---|
321 | <!--
|
---|
322 | <option name="-retrieve_mir_metadata" value="true"/>
|
---|
323 | -->
|
---|
324 | <option name="-enable_cache"/>
|
---|
325 | </plugin>
|
---|
326 |
|
---|
327 | <plugin name="TextPlugin"/>
|
---|
328 | <plugin name="HTMLPlugin"/>
|
---|
329 | <plugin name="EmailPlugin"/>
|
---|
330 | <plugin name="PDFv2Plugin"/>
|
---|
331 | <plugin name="RTFPlugin"/>
|
---|
332 | <plugin name="WordPlugin"/>
|
---|
333 | <plugin name="PostScriptPlugin"/>
|
---|
334 | <plugin name="PowerPointPlugin"/>
|
---|
335 | <plugin name="ExcelPlugin"/>
|
---|
336 | <plugin name="ImagePlugin"/>
|
---|
337 | <plugin name="ISISPlugin"/>
|
---|
338 | <plugin name="NulPlugin"/>
|
---|
339 | <plugin name="MetadataXMLPlugin"/>
|
---|
340 | <plugin name="ArchivesInfPlugin"/>
|
---|
341 | <plugin name="DirectoryPlugin"/>
|
---|
342 | </pluginList>
|
---|
343 | </import>
|
---|
344 | <importOption name="OIDtype" value="assigned"/>
|
---|
345 | <importOption name="OIDmetadata" value="amc.id"/>
|
---|
346 |
|
---|
347 | <browse>
|
---|
348 |
|
---|
349 | <classifier name="AZCompactList">
|
---|
350 | <option name="-metadata" value="dc.Title;amc.title;ex.amc.title;Title"/>
|
---|
351 | <option name="-mingroup" value="2"/>
|
---|
352 | </classifier>
|
---|
353 | <classifier name="AZCompactList">
|
---|
354 | <option name="-metadata" value="dc.Creator,amc.artist,ex.amc.artist"/>
|
---|
355 | <option name="-buttonname" value="Artists"/>
|
---|
356 | <option name="-mingroup" value="1"/>
|
---|
357 | <option name="-minnesting" value="40"/>
|
---|
358 | </classifier>
|
---|
359 | <format>
|
---|
360 |
|
---|
361 | <xsl:template name="gsf-link-render-wave">
|
---|
362 | <xsl:variable name="collNameLocal" select="/page/pageResponse/collection/@name"/>
|
---|
363 | <xsl:variable name="opt-title">
|
---|
364 | <xsl:choose>
|
---|
365 | <xsl:when test="@title">
|
---|
366 | <xsl:attribute name="title">
|
---|
367 | <xsl:value-of select="@title"/>
|
---|
368 | </xsl:attribute>
|
---|
369 | </xsl:when>
|
---|
370 | <xsl:when test="@titlekey">
|
---|
371 | <xsl:attribute name="title">
|
---|
372 | <xsl:value-of disable-output-escaping="yes" select="util:getCollectionText($collNameLocal, $site_name, /page/@lang, '{@titlekey}')"/>
|
---|
373 | </xsl:attribute>
|
---|
374 | </xsl:when>
|
---|
375 | </xsl:choose>
|
---|
376 | </xsl:variable>
|
---|
377 |
|
---|
378 | <a>
|
---|
379 | <xsl:if test="@target">
|
---|
380 | <xsl:attribute name='target'>
|
---|
381 | <xsl:value-of select='@target'/>
|
---|
382 | </xsl:attribute>
|
---|
383 | </xsl:if>
|
---|
384 |
|
---|
385 |
|
---|
386 | <xsl:copy-of select="$opt-title"/>
|
---|
387 | <xsl:attribute name="href">
|
---|
388 | <xsl:value-of select='$library_name'/>
|
---|
389 | <xsl:text>/collection/</xsl:text>
|
---|
390 | <xsl:value-of select='/page/pageResponse/collection/@name'/>
|
---|
391 | <xsl:text>/document/</xsl:text>
|
---|
392 | <xsl:choose>
|
---|
393 | <xsl:when test="@OID">
|
---|
394 | <xsl:value-of select="@OID"/>
|
---|
395 | </xsl:when>
|
---|
396 | <xsl:when test="@OIDmetadata">
|
---|
397 | <xsl:variable name="OIDmeta" select="@OIDmetadata"/>
|
---|
398 | <xsl:value-of select="(.//metadataList)[last()]/metadata[@name='{$OIDmeta}']"/>
|
---|
399 | </xsl:when>
|
---|
400 | <xsl:otherwise>
|
---|
401 | <xsl:value-of select='@nodeID'/>
|
---|
402 | </xsl:otherwise>
|
---|
403 | </xsl:choose>
|
---|
404 | <xsl:text>?renderWave=1</xsl:text>
|
---|
405 | </xsl:attribute>
|
---|
406 | [Traditional Wave Display]
|
---|
407 | </a>
|
---|
408 | </xsl:template>
|
---|
409 |
|
---|
410 | <gsf:template match="documentNode">
|
---|
411 | <td valign="top">
|
---|
412 | <gsf:link type="document" extraLinkArgs="renderWave=0">
|
---|
413 | <gsf:icon type="document"/>
|
---|
414 | </gsf:link>
|
---|
415 | </td>
|
---|
416 | <td valign="top">
|
---|
417 | <gsf:link type="source">
|
---|
418 | <gsf:choose-metadata>
|
---|
419 | <gsf:metadata name="thumbicon"/>
|
---|
420 | <gsf:metadata name="srcicon"/>
|
---|
421 | </gsf:choose-metadata>
|
---|
422 | </gsf:link>
|
---|
423 | </td>
|
---|
424 | <td valign="top">
|
---|
425 | <gsf:link type="document" extraLinkArgs="renderWave=0">
|
---|
426 | <gsf:choose-metadata>
|
---|
427 | <gsf:metadata name="dc.Title"/>
|
---|
428 | <gsf:metadata name="amc.title"/>
|
---|
429 | <gsf:metadata name="exp.Title"/>
|
---|
430 | <gsf:metadata name="Title"/>
|
---|
431 | <gsf:default>Untitled</gsf:default>
|
---|
432 | </gsf:choose-metadata>
|
---|
433 | <gsf:space />
|
---|
434 | </gsf:link>
|
---|
435 |
|
---|
436 | <!--
|
---|
437 | <gsf:link type="document">[Experimental Spectral Frequency]</gsf:link>
|
---|
438 |
|
---|
439 | <gsf:space />
|
---|
440 | -->
|
---|
441 |
|
---|
442 | <!--
|
---|
443 | <gsf:variable name="AssocEssentiaJSON"><gsf:OID/>-AssocEssentia.json</gsf:variable>
|
---|
444 | <a download="{$AssocEssentiaJSON}" href="{$httpCollection}/index/assoc/{$assocFilePath}/{$AssocEssentiaJSON}">Download Audio Features</a>
|
---|
445 | -->
|
---|
446 | <!--
|
---|
447 | <xsl:call-template name="gsf-link-render-wave"/>
|
---|
448 | -->
|
---|
449 | <!--
|
---|
450 | <span id="renderWave">
|
---|
451 | <gsf:link type="document">[Traditional Wave Display]</gsf:link>
|
---|
452 | </span>
|
---|
453 |
|
---|
454 |
|
---|
455 | <gsf:script>
|
---|
456 | var $alink = $('#renderWave a');
|
---|
457 | var alink_href = $alink.attr('href');
|
---|
458 | if (!alink_href.includes('renderWave')) {
|
---|
459 | alink_href += '?renderWave=1';
|
---|
460 | $alink.attr('href',alink_href);
|
---|
461 | }
|
---|
462 | </gsf:script>
|
---|
463 |
|
---|
464 | -->
|
---|
465 |
|
---|
466 | </td>
|
---|
467 | </gsf:template>
|
---|
468 | <gsf:template match="classifierNode">
|
---|
469 | <td valign="top">
|
---|
470 | <gsf:link type="classifier">
|
---|
471 | <gsf:icon type="classifier"/>
|
---|
472 | </gsf:link>
|
---|
473 | </td>
|
---|
474 | <td valign="top">(<gsf:metadata name="numleafdocs"/>)</td>
|
---|
475 | <td valign="top">
|
---|
476 | <gsf:link type="source">
|
---|
477 | <gsf:choose-metadata>
|
---|
478 | <gsf:metadata name="thumbicon"/>
|
---|
479 | <gsf:metadata name="srcicon"/>
|
---|
480 | </gsf:choose-metadata>
|
---|
481 | </gsf:link>
|
---|
482 | </td>
|
---|
483 | <td valign="top">
|
---|
484 | <gsf:link type="classifier">
|
---|
485 | <gsf:choose-metadata>
|
---|
486 | <gsf:metadata name="dc.Title"/>
|
---|
487 | <gsf:metadata name="amc.title"/>
|
---|
488 | <gsf:metadata name="exp.Title"/>
|
---|
489 | <gsf:metadata name="Title"/>
|
---|
490 | <gsf:default>Untitled</gsf:default>
|
---|
491 | </gsf:choose-metadata>
|
---|
492 | </gsf:link>
|
---|
493 | <gsf:switch>
|
---|
494 | <gsf:metadata name="Source"/>
|
---|
495 | <gsf:when test="exists">
|
---|
496 | <br/>
|
---|
497 | <i>(<gsf:metadata name="Source"/>)</i>
|
---|
498 | </gsf:when>
|
---|
499 | </gsf:switch>
|
---|
500 | </td>
|
---|
501 | </gsf:template>
|
---|
502 | <gsf:template match="classifierNode" mode="horizontal">
|
---|
503 | <gsf:link type="horizontal">
|
---|
504 | <gsf:metadata name="Title"/>
|
---|
505 | </gsf:link>
|
---|
506 | </gsf:template>
|
---|
507 | </format>
|
---|
508 | <!--
|
---|
509 |
|
---|
510 | <classifier name="List">
|
---|
511 | <option name="-metadata" value="dc.Title;Title"/>
|
---|
512 | <option name="-partition_type_within_level" value="approximate_size"/>
|
---|
513 | <option name="-removeprefix" value="""/>
|
---|
514 | </classifier>
|
---|
515 | <classifier name="AZCompactList">
|
---|
516 | <option name="-metadata" value="dc.Type.genre"/>
|
---|
517 | <option name="-buttonname" value="Genre"/>
|
---|
518 | </classifier>
|
---|
519 | <format>
|
---|
520 | <gsf:template match="documentNode">
|
---|
521 | <td valign="top">
|
---|
522 | <gsf:link type="document">
|
---|
523 | <gsf:icon type="document"/>
|
---|
524 | </gsf:link>
|
---|
525 | </td>
|
---|
526 | <td valign="top">
|
---|
527 | <gsf:metadata name="srclink"/>
|
---|
528 | <gsf:choose-metadata>
|
---|
529 | <gsf:metadata name="thumbicon"/>
|
---|
530 | <gsf:metadata name="srcicon"/>
|
---|
531 | </gsf:choose-metadata>
|
---|
532 | <gsf:metadata name="/srclink"/>
|
---|
533 | </td>
|
---|
534 | <td valign="top">
|
---|
535 | <gsf:choose-metadata>
|
---|
536 | <gsf:metadata name="dc.Title"/>
|
---|
537 | <gsf:metadata name="exp.Title"/>
|
---|
538 | <gsf:metadata name="Title"/>
|
---|
539 | <gsf:default>Untitled</gsf:default>
|
---|
540 | </gsf:choose-metadata>
|
---|
541 | <gsf:switch>
|
---|
542 | <gsf:metadata name="Source"/>
|
---|
543 | <gsf:when test="exists">
|
---|
544 | <br/>
|
---|
545 | <i>(<gsf:metadata name="Source"/>)</i>
|
---|
546 | </gsf:when>
|
---|
547 | </gsf:switch>
|
---|
548 | </td>
|
---|
549 | </gsf:template>
|
---|
550 | <gsf:template match="classifierNode">
|
---|
551 | <td valign="top">
|
---|
552 | <gsf:link type="classifier">
|
---|
553 | <gsf:icon type="classifier"/>
|
---|
554 | </gsf:link>
|
---|
555 | </td>
|
---|
556 | <td valign="top">
|
---|
557 | <gsf:metadata name="srclink"/>
|
---|
558 | <gsf:choose-metadata>
|
---|
559 | <gsf:metadata name="thumbicon"/>
|
---|
560 | <gsf:metadata name="srcicon"/>
|
---|
561 | </gsf:choose-metadata>
|
---|
562 | <gsf:metadata name="/srclink"/>
|
---|
563 | </td>
|
---|
564 | <td valign="top">
|
---|
565 | <gsf:choose-metadata>
|
---|
566 | <gsf:metadata name="dc.Title"/>
|
---|
567 | <gsf:metadata name="exp.Title"/>
|
---|
568 | <gsf:metadata name="Title"/>
|
---|
569 | <gsf:default>Untitled</gsf:default>
|
---|
570 | </gsf:choose-metadata>
|
---|
571 | <gsf:switch>
|
---|
572 | <gsf:metadata name="Source"/>
|
---|
573 | <gsf:when test="exists">
|
---|
574 | <br/><i>(<gsf:metadata name="Source"/>)</i>
|
---|
575 | </gsf:when>
|
---|
576 | </gsf:switch>
|
---|
577 | </td>
|
---|
578 | </gsf:template>
|
---|
579 | <gsf:template match="classifierNode" mode="horizontal">
|
---|
580 | <gsf:link type="horizontal">
|
---|
581 | <gsf:metadata name="Title"/>
|
---|
582 | </gsf:link>
|
---|
583 | </gsf:template>
|
---|
584 | </format>
|
---|
585 | -->
|
---|
586 | </browse>
|
---|
587 |
|
---|
588 |
|
---|
589 | <display>
|
---|
590 | <format>
|
---|
591 | <gsf:option name="TOC" value="false"/>
|
---|
592 | <gsf:template name="documentHeading">
|
---|
593 | <gsf:variable name="loggedInUsername"><xsl:value-of select="/page/pageRequest/userInformation/@username"/></gsf:variable>
|
---|
594 |
|
---|
595 | <!-- title will be dsiplayed in playbar at top of page, so supress showing title here -->
|
---|
596 | <!--
|
---|
597 | <gsf:script src="interfaces/{$interface_name}/js/direct-edit-source.js"/>
|
---|
598 | <xsl:call-template name="init-direct-edit"/>
|
---|
599 | -->
|
---|
600 | </gsf:template>
|
---|
601 |
|
---|
602 | <gsf:template name="documentContentXXX">
|
---|
603 | <xsl:param name="collName"/>
|
---|
604 | <xsl:variable name="docID" select="@docID"/>
|
---|
605 | </gsf:template>
|
---|
606 |
|
---|
607 | <!--
|
---|
608 | <xsl:variable name="httpCollection"><xsl:value-of select="/page/pageResponse/collection/metadataList/metadata[@name='httpPath']"/></xsl:variable>
|
---|
609 | -->
|
---|
610 |
|
---|
611 |
|
---|
612 |
|
---|
613 |
|
---|
614 |
|
---|
615 | <xsl:template name="documentContent">
|
---|
616 | <xsl:variable name="httpCollection">library/sites/<xsl:value-of select="$site_name"/>/collect/<xsl:value-of select="/page/pageResponse/collection/@name"/></xsl:variable>
|
---|
617 | <xsl:variable name="assocFilePath"><gsf:metadata name="assocfilepath" select="root"/></xsl:variable>
|
---|
618 |
|
---|
619 | <xsl:variable name="cgiargFrameOffset">
|
---|
620 | <xsl:value-of select="/page/pageRequest/paramList/param[@name='p.frameOffset']/@value"/>
|
---|
621 | </xsl:variable>
|
---|
622 | <xsl:variable name="lastfmtrackurl">
|
---|
623 | <gsf:metadata name="dc.Identifier.lastfmtrackurl"/>
|
---|
624 | </xsl:variable>
|
---|
625 | <xsl:variable name="imageUrls">
|
---|
626 | <gsf:metadata multiple="true" name="EchoNest.Artist-RelatedImage" separator="&quot;, &quot;"/>
|
---|
627 | </xsl:variable>
|
---|
628 | <xsl:variable name="echonestid">
|
---|
629 | <gsf:metadata name="dc.Identifier"/>
|
---|
630 | </xsl:variable>
|
---|
631 |
|
---|
632 | <!--
|
---|
633 | <xsl:variable name="assocFilePath"><gsf:metadata name="assocfilepath" select="root"/></xsl:variable>
|
---|
634 | -->
|
---|
635 |
|
---|
636 | <gsf:script src="{$httpCollection}/js/av_document.js"/>
|
---|
637 |
|
---|
638 | <div id="metadata-documenttext" class="documenttext" style="padding-bottom: 35px; width:100%;">
|
---|
639 | <style>
|
---|
640 | .doc-metadata td { padding: 7px; }
|
---|
641 | </style>
|
---|
642 | <table class="doc-metadata" style="width: 100%;">
|
---|
643 | <tbody>
|
---|
644 | <tr style="background-color:#C4CBA1">
|
---|
645 | <td style="width: 4rem;">
|
---|
646 | Title:
|
---|
647 | </td>
|
---|
648 | <td>
|
---|
649 | <gsf:metadata name="amc.title"/>
|
---|
650 | </td>
|
---|
651 | </tr>
|
---|
652 |
|
---|
653 | <tr style="background-color:#fff">
|
---|
654 | <td>Artist:</td>
|
---|
655 | <td><gsf:metadata name="amc.artist"/></td>
|
---|
656 | </tr>
|
---|
657 |
|
---|
658 | <!--
|
---|
659 | <tr style="background-color:#C4CBA1">
|
---|
660 | <td>Essentia MFCC Features:</td><td><a href="{$httpCollection}/index/assoc/{$assocFilePath}/pessentia.json">Download</a></td>
|
---|
661 | </tr>
|
---|
662 |
|
---|
663 | <tr style="background-color:#fff">
|
---|
664 | <td>Weka Predicted Arousal-Valence Features:</td><td><a href="{$httpCollection}/index/assoc/{$assocFilePath}/av.json">Download</a></td>
|
---|
665 | </tr>
|
---|
666 | -->
|
---|
667 |
|
---|
668 | </tbody>
|
---|
669 | </table>
|
---|
670 | </div>
|
---|
671 |
|
---|
672 |
|
---|
673 | <div id="playervisual-documenttext" class="documenttext" style="position: relative;">
|
---|
674 | <div id="ajax-loaded-assocfilepath" style="display: none;"><gsf:metadata name="assocfilepath" pos="first"/></div>
|
---|
675 |
|
---|
676 | <style>
|
---|
677 | #hide-av-chart {
|
---|
678 | display: none;
|
---|
679 | }
|
---|
680 |
|
---|
681 | #record-av {
|
---|
682 | display: none;
|
---|
683 | }
|
---|
684 | span.display-view-modes, a.display-view-modes {
|
---|
685 | padding: 5px;
|
---|
686 | }
|
---|
687 |
|
---|
688 | .display-view-modes:hover {
|
---|
689 | background-color: #b0b0b0;
|
---|
690 | }
|
---|
691 | span.hd-chart-labelXXXX {
|
---|
692 | display: inline-block;
|
---|
693 | width: 120px;
|
---|
694 | }
|
---|
695 | </style>
|
---|
696 |
|
---|
697 | <div style="position: absolute; right: 24px; top: -23px; z-index: 1000; font-size: 90%; font-styleXX:italic">
|
---|
698 | <span style="display: inline-block">
|
---|
699 | <a id="switch-to-waveform" class="display-view-modes" stylexx="display: none;" href="">Switch to Waveform</a>
|
---|
700 | <a id="switch-to-spectrogram" class="display-view-modes" stylexx="display: none;" href="">Switch to Spectrogram</a>
|
---|
701 | </span>
|
---|
702 | <div style="display:none;">
|
---|
703 | <span style="display: inline-block; width: 140px;">
|
---|
704 | | <span id="show-av-chart" class="display-view-modes hd-chart-label" onclick="return showAVChart();">Display AV Chart</span>
|
---|
705 | <span id="hide-av-chart" class="display-view-modes hd-chart-label" onclick="return hideAVChart();">Hide AV Chart</span>
|
---|
706 | </span>
|
---|
707 | </div>
|
---|
708 | <!-- Keep if ever wanting to go back to logging in to record AV experience -->
|
---|
709 | <!--
|
---|
710 | <span style="display: inline-block; width: 270px;">
|
---|
711 | | <span id="login-to-record-av" class="display-view-modes" onclick="loginToRecord()">⏺ Login to record <i>your</i> AV experience</span>
|
---|
712 | <span id="record-av" class="display-view-modes" onclick="loginToRecord()">
|
---|
713 | ⏺ Record <i>your</i> AV experience (<a id="record-av-logout" href="">logout</a>)
|
---|
714 | </span>
|
---|
715 | </span>
|
---|
716 | -->
|
---|
717 | <div style="display:none;">
|
---|
718 | <span style="display: inline-block; width: 270px;">
|
---|
719 | | <span id="record-av" class="display-view-modes" style="display: inline;" onclick="loginToRecord()">
|
---|
720 | ⏺ Customise your AV experience
|
---|
721 | </span>
|
---|
722 | </span>
|
---|
723 | </div>
|
---|
724 |
|
---|
725 | </div>
|
---|
726 |
|
---|
727 | <style>
|
---|
728 | #wave-timeline {
|
---|
729 | background-color: #fff;
|
---|
730 | }
|
---|
731 | </style>
|
---|
732 |
|
---|
733 | <div id="demo">
|
---|
734 | <div id="waveform">
|
---|
735 | <!-- Here be the waveform -->
|
---|
736 | <xsl:text> </xsl:text>
|
---|
737 | </div>
|
---|
738 | <div id="wave-timeline"><xsl:text> </xsl:text></div>
|
---|
739 | <div id="wave-spectrogram"><xsl:text> </xsl:text></div>
|
---|
740 | <div id="wave-harmonic-pitch-class-profile"><xsl:text> </xsl:text></div>
|
---|
741 |
|
---|
742 | <div id = "av-display" style="margin: auto; width: 200px;padding-top: 18px; display: none;">
|
---|
743 |
|
---|
744 | <div id="arousal-display" style="display: inline-block; width: 95px;">
|
---|
745 | Arousal:
|
---|
746 | <span id="arousal-val">
|
---|
747 | 0
|
---|
748 | </span>
|
---|
749 | </div>
|
---|
750 |
|
---|
751 | <div id="valence-display" style="display: inline-block; width: 95px;">
|
---|
752 | Valence
|
---|
753 | <span id="valence-val">
|
---|
754 | 0
|
---|
755 | </span>
|
---|
756 | </div>
|
---|
757 | </div>
|
---|
758 |
|
---|
759 |
|
---|
760 | <div>
|
---|
761 | <style>
|
---|
762 | .controls .btn {
|
---|
763 | margin-bottom: 25px;
|
---|
764 | }
|
---|
765 | </style>
|
---|
766 |
|
---|
767 | <div id="av-timelinebar-help" style="display: none; background-color: rgb(255,255,255); padding: 6px; position: absolute; right: 4px; font-style: italic; font-size: 90%; padding-top: 0.5rem;">
|
---|
768 | Audio player Arousal-Valence timeline bar:
|
---|
769 | <ul style="margin: 0.2rem;">
|
---|
770 | <li>Width corresponds to valence</li>
|
---|
771 | <li>Intensity of white corresponds to arousal</li>
|
---|
772 | </ul>
|
---|
773 | </div>
|
---|
774 |
|
---|
775 | <div class="controls" style="padding-bottom: 0px;">
|
---|
776 | <button class="btn btn-primary" onclick="AVSeekTo(0)">
|
---|
777 | <i id="ws-return-to-start-icon" class="fa-solid fa-backward-fast" ><xsl:text> </xsl:text></i>
|
---|
778 | Return to Start
|
---|
779 | </button>
|
---|
780 |
|
---|
781 | <button class="btn btn-primary" data-action="play" style="display: none;">
|
---|
782 | <i class="glyphicon glyphicon-play"><xsl:text> </xsl:text></i>
|
---|
783 | Play /
|
---|
784 | <i class="glyphicon glyphicon-pause"><xsl:text> </xsl:text></i>
|
---|
785 | Pause
|
---|
786 | </button>
|
---|
787 |
|
---|
788 |
|
---|
789 | <button id="ws-playpause" class="btn btn-primary" onclick="AVPlayPause()">
|
---|
790 | <span id="ws-playpause-label" style="display: inline-block; width: 3rem;">Play</span>
|
---|
791 | <span style="display: inline-block; width: 1rem;">
|
---|
792 | <i id="ws-play-icon" class="fa-solid fa-play" ><xsl:text> </xsl:text></i>
|
---|
793 | <i id="ws-pause-icon" class="fa-solid fa-pause" style="display:none"><xsl:text> </xsl:text></i>
|
---|
794 | </span>
|
---|
795 | </button>
|
---|
796 |
|
---|
797 | </div>
|
---|
798 |
|
---|
799 | </div>
|
---|
800 |
|
---|
801 | </div>
|
---|
802 |
|
---|
803 |
|
---|
804 |
|
---|
805 | <gsf:variable name="mp3url"><xsl:value-of select="$httpCollection"/>/index/assoc/<xsl:value-of select="$assocFilePath"/>/audio.mp3</gsf:variable>
|
---|
806 |
|
---|
807 | <script src="ext/audio/wavesurfer-player.js">
|
---|
808 | <xsl:text> </xsl:text>
|
---|
809 | </script>
|
---|
810 |
|
---|
811 | <gsf:script>
|
---|
812 | //var currentPosIsZero = true;
|
---|
813 |
|
---|
814 | /*
|
---|
815 | document.addEventListener('DOMContentLoaded', function() {
|
---|
816 | postInitWavesurfer(wavesurfer);
|
---|
817 | });
|
---|
818 | */
|
---|
819 |
|
---|
820 | $(document).ready(function() {
|
---|
821 | postInitWavesurfer(wavesurfer);
|
---|
822 | });
|
---|
823 |
|
---|
824 | </gsf:script>
|
---|
825 |
|
---|
826 | </div>
|
---|
827 |
|
---|
828 |
|
---|
829 | <div id="av-chart-outerdiv" style="display: none;">
|
---|
830 | <hr/>
|
---|
831 | <div style="float: right">
|
---|
832 | <span id="hide-av-chart-rtab" class="display-view-modes" style="display: inline-block;" onclick="hideAVChart();">Hide AV Chart</span>
|
---|
833 | <br/>
|
---|
834 | <span id="clear-user-av-chart-rtab" class="display-view-modes" style="display: inline-block;" onclick="clearRecordedUserAVChart();">Clear AV Chart</span>
|
---|
835 | <br/>
|
---|
836 | <span id="clear-all-user-av-chart-rtab" class="display-view-modes" style="display: inline-block;" onclick="clearRecordedUserAVChartAll();">Clear ALL AVs</span>
|
---|
837 | </div>
|
---|
838 |
|
---|
839 | <div style="width: 700px; margin: auto;">
|
---|
840 | <style>
|
---|
841 | .recommend-cursor {
|
---|
842 | cursor: url(<xsl:value-of select="$library_name"/>/sites/<xsl:value-of select="$site_name"/>/collect/<xsl:value-of select="$collName"/>/images/crosshair-cursor-black32.png) 16 16, crosshair
|
---|
843 | }
|
---|
844 |
|
---|
845 | .record-cursor-NeededToTriggerResourceLoad {
|
---|
846 | cursor: url(<xsl:value-of select="$library_name"/>/sites/<xsl:value-of select="$site_name"/>/collect/<xsl:value-of select="$collName"/>/images/crosshair-cursor-red32.png) 16 16, crosshair
|
---|
847 | }
|
---|
848 | </style>
|
---|
849 | <gsf:variable name="collImagesURL"><xsl:value-of select="$library_name"/>/sites/<xsl:value-of select="$site_name"/>/collect/<xsl:value-of select="$collName"/>/images</gsf:variable>
|
---|
850 |
|
---|
851 | <gsf:div id="cancel-resume-save-confirm-div"/>
|
---|
852 |
|
---|
853 | <div id="av-chart-div" style="position: relative; heightXXX: 325px; width: 300px; widthXXXYYY: 400px; margin: auto"> <!-- av-chart-width av-chart-height + 25-->
|
---|
854 | <div style="position: absolute; top: 0; leftXXXYYY: 50px; width: 300px; height: 300px; pointer-events: none;"> <!-- av-chart-width -->
|
---|
855 | <canvas id="av-chart-canvas" style="XXwidth: 100%; height: 300px;"> <!-- av-chart-width -->
|
---|
856 | Your browser does not support the canvas element
|
---|
857 | </canvas>
|
---|
858 | </div>
|
---|
859 | <!-- VVV av-chart-width -->
|
---|
860 | <img id="av-chart-img" width="300"
|
---|
861 | style="cursor: crosshair; padding-leftXXXYYY: 50px;"
|
---|
862 | src="{$library_name}/sites/{$site_name}/collect/{$collName}/images/av-diagram-bw.svg" />
|
---|
863 |
|
---|
864 | <div>
|
---|
865 | <canvas id="av-chart-canvas-unlabeled" width="400" height="362"
|
---|
866 | style="position: absolute; top: 0; left: 0px; widthXXX: 400px; heightXXX: 362px; heightXXX: 100%; opacity:1.0; pointer-events: none;">
|
---|
867 | Your browser does not support the canvas element
|
---|
868 | </canvas>
|
---|
869 | <img id="av-chart-img-unlabeled" class="record-cursor" width="400"
|
---|
870 | style="background-colorXX: #fefefe; display: none;"
|
---|
871 | src="{$library_name}/sites/{$site_name}/collect/{$collName}/images/av-diagram-bw--unlabeled.svg" />
|
---|
872 | </div>
|
---|
873 |
|
---|
874 |
|
---|
875 | <!--
|
---|
876 | <gsf:variable name="avChartSVGFilename"><xsl:value-of select="$library_name/sites/$site_name/collect/$collName/images/av-diagram-bw.svg"/></gsf:variable>
|
---|
877 | <svg id="av-chart-svg" width="300" />
|
---|
878 | <gsf:script>
|
---|
879 | $(document).ready(function() {
|
---|
880 | console.log("*****!!!!! svg URL/filename = " + gs.variables.avChartSVGFilename);
|
---|
881 |
|
---|
882 | $.ajax({
|
---|
883 | type: 'GET',
|
---|
884 | url: gs.variables.avChartSVGFilename,
|
---|
885 | dataType: 'html'
|
---|
886 | })
|
---|
887 | .done(function(data) {
|
---|
888 | //console.log(data);
|
---|
889 | //$("#av-chart-svg").append(data);
|
---|
890 | });
|
---|
891 | });
|
---|
892 | </gsf:script>
|
---|
893 | -->
|
---|
894 |
|
---|
895 | </div>
|
---|
896 |
|
---|
897 | <div id="start-av-recording" style="display:none;">
|
---|
898 | To customise your Musical Affect Recommender experience, use the AV circle above to record
|
---|
899 | the Arousal-Valence levels you perceive. This is used by MARS to personalise the
|
---|
900 | recommendations the system makes. The more musical works you record AV values for,
|
---|
901 | the more data MARS has to go on.
|
---|
902 | <span id="av-recording-coords" style="display:none;">AV coord: </span>
|
---|
903 | <ul>
|
---|
904 | <li>Click in the centre of the Arousal-Valence space above to initiate recording</li>
|
---|
905 | <li>Move your mouse-cursor around inside the circle to reflect the Arousal-Valence levels you perceive</li>
|
---|
906 | <li>Click again inside the circle at any point, if you want to cancel/pause or save the recording</li>
|
---|
907 | <li>If you listen all the way through to the end of the work, you will be promted at the end about canceling or saving the recording.</li>
|
---|
908 | </ul>
|
---|
909 | </div>
|
---|
910 |
|
---|
911 | <div id="start-av-recommendation">
|
---|
912 | <i>Click inside the Arousal-Valence space above to initiate an AV-based recommendation.</i>
|
---|
913 | </div>
|
---|
914 |
|
---|
915 | </div>
|
---|
916 |
|
---|
917 | </div>
|
---|
918 |
|
---|
919 |
|
---|
920 |
|
---|
921 | <gsf:variable name="docID"><xsl:value-of select="@nodeID"/></gsf:variable>
|
---|
922 |
|
---|
923 | <hr/>
|
---|
924 | <div id="recommendationArea">
|
---|
925 |
|
---|
926 | <form id="av-query-form" action="{$library_name}" method="get" name="QueryForm">
|
---|
927 | <input name="a" type="hidden" value="q"/>
|
---|
928 | <input name="sa" type="hidden">
|
---|
929 | <xsl:attribute name="value">
|
---|
930 | <xsl:value-of select="/page/pageRequest/@subaction"/>
|
---|
931 | </xsl:attribute>
|
---|
932 | </input>
|
---|
933 | <input name="rt" type="hidden" value="rd"/>
|
---|
934 | <input name="s" type="hidden" value="AudioQuery"/>
|
---|
935 | <input name="c" type="hidden" value="{$collName}"/>
|
---|
936 | <xsl:if test="not(paramList/param[@name='startPage'])">
|
---|
937 | <input name="startPage" type="hidden" value="1"/>
|
---|
938 | </xsl:if>
|
---|
939 | <xsl:choose>
|
---|
940 | <xsl:when test="/page/pageRequest/paramList/param[@name = 's1.maxDocs']">
|
---|
941 | <input name="s1.maxDocs" type="hidden">
|
---|
942 | <xsl:attribute name="value">
|
---|
943 | <xsl:value-of select="/page/pageRequest/paramList/param[@name = 's1.maxDocs']/@value"/>
|
---|
944 | </xsl:attribute>
|
---|
945 | </input>
|
---|
946 | </xsl:when>
|
---|
947 | <xsl:otherwise>
|
---|
948 | <input name="s1.maxDocs" type="hidden" value="5"/>
|
---|
949 | </xsl:otherwise>
|
---|
950 | </xsl:choose>
|
---|
951 | <xsl:choose>
|
---|
952 | <xsl:when test="/page/pageRequest/paramList/param[@name = 's1.hitsPerPage']">
|
---|
953 | <input name="s1.hitsPerPage" type="hidden">
|
---|
954 | <xsl:attribute name="value">
|
---|
955 | <xsl:value-of select="/page/pageRequest/paramList/param[@name = 's1.hitsPerPage']/@value"/>
|
---|
956 | </xsl:attribute>
|
---|
957 | </input>
|
---|
958 | </xsl:when>
|
---|
959 | <xsl:otherwise>
|
---|
960 | <input name="s1.hitsPerPage" type="hidden" value="5"/>
|
---|
961 | </xsl:otherwise>
|
---|
962 | </xsl:choose>
|
---|
963 |
|
---|
964 | <!--
|
---|
965 | <input name="q" type="hidden" value="{$assocFilePath}" />
|
---|
966 | -->
|
---|
967 | <input name="q" type="hidden" value="{$docID}" />
|
---|
968 | <input name="s1.query" type="hidden" value="{$docID}" />
|
---|
969 |
|
---|
970 | <input name="s1.offset" type="hidden" value="0"/>
|
---|
971 | <input name="s1.length" type="hidden" value="200"/>
|
---|
972 |
|
---|
973 | <input name="s1.arousal" type="hidden" value="0"/>
|
---|
974 | <input name="s1.valence" type="hidden" value="0"/>
|
---|
975 |
|
---|
976 | <div style="font-style: italic; min-height: 3.5rem;">
|
---|
977 | <div style="float:right;">
|
---|
978 | <span style="display: inline-block; margin-bottomXXXX: 5px;" class="display-view-modes" onclick="return loginToRecord()">
|
---|
979 | <img width="16" height="16" src="{$library_name}/sites/{$site_name}/collect/{$collName}/images/crosshair-cursor-red32.png"/>
|
---|
980 | Show your AV Feelings
|
---|
981 | </span>
|
---|
982 | <br />
|
---|
983 | <span style="display: inline-block; margin-bottomXXXX: 10px;;" class="display-view-modes" onclick="return showAVChartLabelled();">
|
---|
984 | <canvas id="choose-within-av-chart-legend" width="16" height="16" style="width: 16px; height: 16px;">
|
---|
985 | Your browser does not support the canvas element
|
---|
986 | </canvas>
|
---|
987 | <gsf:script>
|
---|
988 | $(document).ready(function() {
|
---|
989 | var cwav_chart_legend = document.getElementById('choose-within-av-chart-legend');
|
---|
990 |
|
---|
991 | var ctx = cwav_chart_legend.getContext("2d");
|
---|
992 | ctx.clearRect(0, 0, cwav_chart_legend.width, cwav_chart_legend.height);
|
---|
993 | ctx.beginPath();
|
---|
994 | ctx.arc(8, 8, 4.5, 0, 2*Math.PI, false);
|
---|
995 | ctx.fillStyle = 'rgba(50,50,128,0.5)';
|
---|
996 | ctx.fill();
|
---|
997 | ctx.lineWidth = 1;
|
---|
998 | ctx.strokeStyle = 'rgba(0,0,160,0.5)';
|
---|
999 | ctx.stroke();
|
---|
1000 | });
|
---|
1001 | </gsf:script>
|
---|
1002 | Choose within AV Chart
|
---|
1003 | </span>
|
---|
1004 | </div>
|
---|
1005 |
|
---|
1006 | <span id="makeRecommendationFrom">
|
---|
1007 | Based on the start of this musical/sound art work:
|
---|
1008 | </span>
|
---|
1009 | <input onclick="return preSubmit(this.form);" type="submit" styleXXXX="font-size: 1.2rem;" value="Make Arousal-Valence Recommendation"/>
|
---|
1010 | <div id="makeRecommendationFrom-AV" style="font-style: italics; font-size: 90%; display: none;"> <!-- **** -->
|
---|
1011 | <xsl:text> </xsl:text>
|
---|
1012 | </div>
|
---|
1013 | <div id="overall-personal-bias" style="font-style: italics; font-size: 90%;">
|
---|
1014 | Personal Bias (Arousal,Valence): No user recordings currently made
|
---|
1015 | </div>
|
---|
1016 | </div>
|
---|
1017 |
|
---|
1018 | <div style="font-style: italics; display: none;">
|
---|
1019 | Make arousal-valence music recommendation based on content @ <span id="audioCurrentPos">0 secs
|
---|
1020 | </span>:
|
---|
1021 | <!--,
|
---|
1022 | with excerpt lasting <span class="editable-offset" id="audioWindowDuration" style="cursor: pointer; border: 1px solid black; padding: 3px; width: 200px; min-width: 200px;">3.0</span> secs
|
---|
1023 | -->
|
---|
1024 | </div>
|
---|
1025 | </form>
|
---|
1026 | <div>
|
---|
1027 | <!--
|
---|
1028 | <div id="av-chart-div" style="position: relative; height: 325px; width: 300px; float: right; display: none;">
|
---|
1029 | <div style="position: absolute; top: 0; left: 0; width: 300px; height: 300px; pointer-events: none;">
|
---|
1030 | <canvas id="av-chart-canvas" style="XXwidth: 100%; height: 300px;">
|
---|
1031 | Your browser does not support the canvas element
|
---|
1032 | </canvas>
|
---|
1033 | </div>
|
---|
1034 | <img id="av-chart-img" width="300"
|
---|
1035 | style="cursor: crosshair; background-colorXX: #fefefe;"
|
---|
1036 | src="{$library_name}/sites/{$site_name}/collect/{$collName}/images/av-diagram-bw.svg" />
|
---|
1037 | <div>
|
---|
1038 | <i>Or click inside the Arousal-Valence visualisation above to initiate a new AV-based recommendation.</i>
|
---|
1039 | </div>
|
---|
1040 |
|
---|
1041 | </div>
|
---|
1042 | -->
|
---|
1043 | <div id="resultsAreaDiv" style="padding-top: 1rem; min-height: 325px; display: none;">
|
---|
1044 | <xsl:text> </xsl:text>
|
---|
1045 | </div>
|
---|
1046 | </div>
|
---|
1047 |
|
---|
1048 | </div>
|
---|
1049 | <hr/>
|
---|
1050 | <!--
|
---|
1051 | <script>
|
---|
1052 | <xsl:text disable-output-escaping="yes">
|
---|
1053 | </xsl:text>
|
---|
1054 | </script>
|
---|
1055 | -->
|
---|
1056 |
|
---|
1057 | </xsl:template>
|
---|
1058 |
|
---|
1059 | </format>
|
---|
1060 | </display>
|
---|
1061 |
|
---|
1062 | <replaceListRef id="gs2-standard"/>
|
---|
1063 | <serviceRackList>
|
---|
1064 | <!--
|
---|
1065 | <serviceRack name="GS2WekaDBSearch">
|
---|
1066 | </serviceRack>
|
---|
1067 | -->
|
---|
1068 | <!--
|
---|
1069 | <serviceRack name="GS2WekaAVRecommender">
|
---|
1070 | </serviceRack>
|
---|
1071 | -->
|
---|
1072 |
|
---|
1073 | <!-- comment out the following serviceRack if you want to disable OAI for this collection -->
|
---|
1074 | <serviceRack name="OAIPMH">
|
---|
1075 | <ListMetadataFormats>
|
---|
1076 | <!--What metadata sets to support is collection specific. To support other metadata schema, simply add a metadataFormat element here.
|
---|
1077 | The support of unqualified Dublin Core metadata set is mandatory in the oai specification.
|
---|
1078 | -->
|
---|
1079 | <metadataFormat metadataPrefix="oai_dc">
|
---|
1080 | <metadataPrefix>oai_dc</metadataPrefix>
|
---|
1081 | <schema>http://www.openarchives.org/OAI/2.0/oai_dc.xsd</schema>
|
---|
1082 | <metadataNamespace>http://www.openarchives.org/OAI/2.0/oai_dc/</metadataNamespace>
|
---|
1083 | <!--<metadataElements>dc.Title,dc.Creator,dc.Subject,dc.Description,dc.Publisher,dc.Contributor,dc.Date,dc.Type,dc.Format,dc.Identifier,dc.Source,dc.Language,dc.Relation,dc.Coverage,dc.Rights</metadataElements>
|
---|
1084 | -->
|
---|
1085 | <mappingList>
|
---|
1086 | <!--
|
---|
1087 | The mapping is in the form: <publicly supported metadata name>,<mapped metadata name>, short as <A>,<B>
|
---|
1088 | The first metadata name is medatory; if there is no mapped name followed, then the first name must be used by the records and
|
---|
1089 | searchable in the database, otherwise it is the mapped name stored in the database. The number of mapping elements matches the
|
---|
1090 | number of external metadata of the records. If only one name is present, the returned metadata will use this name plus the retrieved value;
|
---|
1091 | if both <A>,<B> are present, the returned metadata will use <A>'s name plus <B>'s value retrieved from database.
|
---|
1092 |
|
---|
1093 | **Bear in mind: if this mapping list is not present, the standard dc. metadata names (15 in total) will be used to retrieve metadata in the database.
|
---|
1094 |
|
---|
1095 | **The only case when this mapping is not present is that: 1. this metadata format is oai_dc; 2. the metadata is also stored in the database by Dublin Core's names.
|
---|
1096 | -->
|
---|
1097 | <mapping>dc.Title,Title</mapping>
|
---|
1098 | <!-- This mapping example means that the dc.Title is requested and the value of the metadata Title, which is used in this repository, is returned as response. -->
|
---|
1099 | </mappingList>
|
---|
1100 | </metadataFormat>
|
---|
1101 | </ListMetadataFormats>
|
---|
1102 | </serviceRack>
|
---|
1103 | </serviceRackList>
|
---|
1104 | </CollectionConfig>
|
---|