source: gs3-installations/mars/trunk/sites/mars/collect/amc-essentia/etc/collectionConfig.xml

Last change on this file was 37673, checked in by davidb, 12 months ago

Reverting back to renderWave=0 as default; added icon/legend for the two different AV charts

File size: 39.9 KB
Line 
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&amp;c=<xsl:value-of select="/page/pageResponse/collection/@name"/>&amp;d=<xsl:value-of select="@nodeID"/>&amp;dt=<xsl:value-of select="@docType"/>&amp;p.frameOffset=<xsl:value-of select="@frameOffset"/>&amp;p.a=q&amp;p.s=<xsl:value-of select="/page/pageResponse/service/@name"/>&amp;hl=on&amp;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&amp;c=<xsl:value-of select="@collection"/>&amp;d=<xsl:value-of select="@nodeID"/>&amp;dt=<xsl:value-of select="@docType"/>p.frameOffset=<xsl:value-of select="@frameOffset"/>&amp;p.a=q&amp;p.s=<xsl:value-of select="/page/pageResponse/service/@name"/>&amp;hl=on&amp;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 &lt; frameOffsetList.length; i++) {
277 var frameOffset = frameOffsetList[i];
278 var offsetInSecs=(250*frameOffset)/1000.0;
279 if (i &gt; 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="&quot;"/>
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="&amp;quot;, &amp;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()">&#x23fa; Login to record <i>your</i> AV experience</span>
712 <span id="record-av" class="display-view-modes" onclick="loginToRecord()">
713 &#x23fa; 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 &#x23fa; 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>
Note: See TracBrowser for help on using the repository browser.