commit 0712f059ee1ec6ff491448958ca7e420fe9ac061 from: Matthias L. Jugel date: Tue Dec 6 17:45:27 2011 UTC midior commit - 9c821de46cd4b91c557d2bf373fc52736265f51b commit + 0712f059ee1ec6ff491448958ca7e420fe9ac061 blob - d004da54a975fc1b3aa808e5abaf547175964f1f blob + 472d0caa0b7793da44af55bbcee2a2eee379af41 --- src/main/scala/twimpact/Midior.scala +++ src/main/scala/twimpact/Midior.scala @@ -1,15 +1,21 @@ package twimpact import io.http.TwitterStream -import javax.sound.midi.{Sequence, MidiSystem} import trending.{MemoryBackend, Timescale, Trevor} +import akka.actor.Scheduler +import java.util.concurrent.TimeUnit +import javax.sound.midi._ - /** * Hello world! * */ object Midior extends App { + private final val PROGRAM = 192 + private final val NOTEON = 144 + private final val NOTEOFF = 128 + + val analyzer = new SimpleAnalyzer(new Trevor(new MemoryBackend), Seq(Timescale(300, 10), Timescale(60, 1))) // Get default sequencer. @@ -19,7 +25,16 @@ object Midior extends App { val sequencer = MidiSystem.getSequencer sequencer.open() + def createEvent(t: Int, ch: Int, instr: Int, vel: Int, tick: Long) = { + val message = new ShortMessage + message.setMessage(t, ch, instr, vel) + new MidiEvent(message, tick) + } + + val sequence = new Sequence(Sequence.PPQ, 10) + val track = sequence.createTrack + val sb = synthesizer.getDefaultSoundbank val instruments = synthesizer.getDefaultSoundbank.getInstruments synthesizer.loadInstrument(instruments(0)) @@ -31,19 +46,57 @@ object Midior extends App { password = "Ywnkmpw." } + synthesizer.getDefaultSoundbank.getInstruments.zipWithIndex.foreach(println(_)) + def findPatch(name: String) = synthesizer.getDefaultSoundbank.getInstruments.indexWhere(_.getName == name) + + + var channelMap: Map[String, (Int, Int)] = Map( + "en" -> (2, findPatch("Steel String Guitar")), + "id" -> (3, findPatch("Nylon Str Guitar")), + "ja" -> (4, findPatch("Shakuhachi")), + "es" -> (5, findPatch("Maracas")), + "nl" -> (6, findPatch("Fiddle")), + "pt" -> (7, findPatch("Tuned Drum")), + "it" -> (8, findPatch("Clean Guitar")), + "da" -> (9, findPatch("Seashore")), + "ko" -> (10, findPatch("Koto")), + "th" -> (11, findPatch("Sitar")), + "fr" -> (12, findPatch("Woodblock")), + "de" -> (13, findPatch("Steel Drums")), + "ar" -> (14, findPatch("Viola")), + "he" -> (15, findPatch("Clarinet")) + ) + + midiChannels(1).programChange(35) + channelMap.foreach { + case (language, (ch, instrument)) => + midiChannels(ch).programChange(instrument) + } + stream.stream(Seq()) { line => analyzer.tweet.fromJSON(line).foreach { tweet => analyzer.analyze(tweet).foreach { info => - if (info.score > 1.0) { - println("score=%.2f rate=%.2f [user=%s, rank=%.2f] %s" - .format(info.score, info.rate, info.rti.user, info.rank, info.rti.text)) - val note = 40 + info.score.toInt - val reverb = 60 + info.rate.toInt - midiChannels(1).noteOff(note) - midiChannels(1).noteOn(note, reverb) + if (info.score > 0.5) { + println("%s: score=%.2f rate=%.2f [user=%s, rank=%.2f]" + .format(info.rti.detectedLanguages.head, info.score, info.rate, info.rti.user, info.rank)) + info.rti.detectedLanguages.foreach { + fl => + val note = (info.score * 5 + info.rank).toInt + val velocity = fl.coverage + + val language = fl.code + val ch = channelMap.get(language).getOrElse((1,1))._1 + + if(ch == 1) { +// midiChannels(ch).noteOn(9, 100) + } else { + midiChannels(ch).noteOn(note, velocity) + Scheduler.scheduleOnce({() => midiChannels(ch).noteOff(note)}, 2000, TimeUnit.MILLISECONDS) + } + } } } } blob - 0633fc1f48ccfa883718efa5927d1212481e0c9f blob + c85e74328c0c222f2e94af12d4181a9424241e77 --- src/main/scala/twimpact/SimpleAnalyzer.scala +++ src/main/scala/twimpact/SimpleAnalyzer.scala @@ -5,6 +5,7 @@ package twimpact import grizzled.slf4j.Logging +import text.{FoundLanguage, LanguageSet} import trending.{Timescale, TwimpactScore, MultiScaleTrend, Trevor} import twitter.{RetweetInfo, Tweet, Twitter} @@ -41,12 +42,33 @@ class SimpleAnalyzer(trevor: Trevor, timescales: Seq[T tweets.put(tweet.id, tweet) tweetFifo.update(tweet.id) + if (rti.isNew) { + val l = languageDetector.detectLanguage(rti.text) + if (l.size >= 1 && l.head.coverage > 50) { + rti.detectedLanguages = l + } else { + val userLanguage = + if (tweet.retweetedStatus.isDefined && tweet.retweetedStatus.get.userLanguage.isDefined) + tweet.retweetedStatus.get.userLanguage.get + else + tweet.userLanguage.getOrElse("??") + + rti.detectedLanguages = new LanguageSet(Seq(new FoundLanguage(userLanguage, 101))) + l + } + } + // make sure the tweet has detected languages + tweet.detectedLanguages = rti.detectedLanguages + val now = tweet.createdAt retweetTrend.update(rti.key, now) userRetweetTrend.update(rti.user, now) - Some(MidiorInfo(rti, retweetTrend.score(rti.key), retweetTrend.rate(rti.key), twimpacts - .computeTwimpact(rti.user))) + Some(MidiorInfo( + rti, + retweetTrend.score(rti.key), + retweetTrend.rate(rti.key), + twimpacts.computeTwimpact(rti.user) + )) case None => None } blob - /dev/null blob + 8c972527de5082888b84b00984be16d83b5858fe (mode 644) --- /dev/null +++ src/main/resources/logback.xml @@ -0,0 +1,23 @@ + + + + + System.out + + %d{HH:mm:ss.SSS} %-5level [%20.20logger{20}] %msg%n + + + + + System.err + + %d{HH:mm:ss.SSS} %-5level [%20.20logger{20}] %msg%n + + + + + + + \ No newline at end of file