]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/score.cc
*** empty log message ***
[lilypond.git] / lily / score.cc
index 04e09684e38b068480a483a9fc2d277fc6121371..7da39afce45a189b2b70d8154868169b752bf7d8 100644 (file)
 Score::Score ()
   : Input ()
 {
-  input_file_ = 0;
   header_ = SCM_EOL;
   music_ = SCM_EOL;
-  errorlevel_ = 0;
 
   smobify_self ();
 }
 
+Score::~Score ()
+{
+  
+}
+
+
+
+
+IMPLEMENT_SMOBS (Score);
+IMPLEMENT_DEFAULT_EQUAL_P (Score);
+
+
+SCM
+Score::mark_smob (SCM s)
+{
+  Score * sc = (Score*) SCM_CELL_WORD_1 (s);
+
+  if (sc->header_)
+    scm_gc_mark (sc->header_);
+  for (int i = sc->defs_.size (); i--;)
+    scm_gc_mark (sc->defs_[i]->self_scm ());
+  
+  return sc->music_;
+}
+
+int
+Score::print_smob (SCM , SCM p, scm_print_state*)
+{
+  scm_puts ("#<Score>", p);
+
+  return 1;
+}
+
+
+
 /*
   store point & click locations.
   Global to save some time. (Sue us!)
  */
-bool store_locations_global_b;
 
 Score::Score (Score const &s)
   : Input (s)
@@ -58,32 +90,35 @@ Score::Score (Score const &s)
   
   for (int i=0; i < s.defs_.size (); i++)
     defs_.push (s.defs_[i]->clone ());
-  errorlevel_ = s.errorlevel_;
 
   header_ = ly_make_anonymous_module ();
   if (ly_module_p (s.header_))
     ly_copy_module_variables (header_, s.header_);
 }
 
-Score::~Score ()
-{
-  
-}
-
 
 
-void
-Score::run_translator (Music_output_def *odef)
+LY_DEFINE(ly_run_translator, "ly:run-translator", 
+         2, 0, 0,
+         (SCM mus, SCM output_def),
+         "Process @var{mus} according to @var{output_def}. A interpretation "
+"context is set up, and @var{mus} is interpreted with it. The  "
+"context is returned in its final state." )
 {
+  Music_output_def *odef = unsmob_music_output_def (output_def);
+  Music * music = unsmob_music (mus);
+
+  SCM_ASSERT_TYPE (music, mus, SCM_ARG1, __FUNCTION__, "Music");
+  SCM_ASSERT_TYPE (odef, output_def, SCM_ARG2, __FUNCTION__, "Output definition");
+  
   Cpu_timer timer;
   Global_translator * trans = odef->get_global_translator ();
   if (!trans)
     {
       programming_error ("no toplevel translator");
-      return ;
+      return SCM_BOOL_F;
     }
   progress_indication (_ ("Interpreting music..."));
-  Music * music = unsmob_music (music_);
   
   trans->final_mom_ = music->get_length ();
   SCM protected_iter =  Music_iterator::get_static_get_iterator (music);
@@ -95,8 +130,7 @@ Score::run_translator (Music_output_def *odef)
   if (! iter->ok ())
     {
       warning (_ ("Need music in a score"));
-      errorlevel_ =1;
-      return ;
+      return SCM_BOOL_F;       // todo: shoudl throw exception.
     }
 
   trans->start ();
@@ -105,73 +139,48 @@ Score::run_translator (Music_output_def *odef)
   scm_remember_upto_here_1 (protected_iter);
   trans->finish ();
 
-  if (errorlevel_)
-    {
-      // should we? hampers debugging.
-      warning (_ ("errors found."));
-    }
-
-  Music_output * output = trans->get_output ();
-  scm_gc_unprotect_object (trans->self_scm ());
-  
   if (verbose_global_b)
     progress_indication (_f ("elapsed time: %.2f seconds",  timer.read ()));
 
-  if (!header_)
-    header_ = ly_make_anonymous_module(); // ug.h
-
-  output->header_ = header_;
-  output->origin_string_ =  location_string ();
-
-  progress_indication ("\n");
-  output->process ();
   
-  delete output ;
+  return scm_gc_unprotect_object (trans->self_scm ());
 }
 
-void
-Score::process ()
-{
-  if (!unsmob_music (music_))
-    return;
 
-  for (int i=0; i < defs_.size (); i++)
-    {
-      if (no_paper_global_b 
-         && dynamic_cast<Paper_def*> (defs_[i]))
-       continue;
-      run_translator (defs_[i]);
-    }
-}
-
-
-void
-Score::add_output (Music_output_def *pap)
+LY_DEFINE(ly_render_output, "ly:render-output",
+         3,0,0,
+         (SCM context, SCM header, SCM out_filename),
+         "Given a Score context in its final state, calculate the output, "
+         "and  dump the result to @var{out-filename}, using "
+         "@var{header} for the bibliographic information.")
 {
-  defs_.push (pap);
-}
-
-IMPLEMENT_SMOBS (Score);
-IMPLEMENT_DEFAULT_EQUAL_P (Score);
-
+  Translator *tr = unsmob_translator (context);
+  Global_translator * gt = dynamic_cast<Global_translator*> (tr);
+  
+  SCM_ASSERT_TYPE(gt, context, SCM_ARG1, __FUNCTION__,
+                 "Score context");
+  SCM_ASSERT_TYPE(ly_module_p(header), header, SCM_ARG2, __FUNCTION__,
+                 "module");
+  SCM_ASSERT_TYPE(gh_string_p (out_filename), out_filename, SCM_ARG3, __FUNCTION__,
+                 "output filename");
 
-SCM
-Score::mark_smob (SCM s)
-{
-  Score * sc = (Score*) SCM_CELL_WORD_1 (s);
+  Music_output * output = gt->get_output ();
 
-  if (sc->header_)
-    scm_gc_mark (sc->header_);
-  for (int i = sc->defs_.size (); i--;)
-    scm_gc_mark (sc->defs_[i]->self_scm ());
+  output->header_ = header;
   
-  return sc->music_;
+  progress_indication ("\n");
+  output->process (ly_scm2string (out_filename));
+  
+  delete output ;
+
+  return SCM_UNDEFINED ;
 }
 
-int
-Score::print_smob (SCM , SCM p, scm_print_state*)
+void
+default_rendering (SCM mus, SCM outdef, SCM head, SCM outname)
 {
-  scm_puts ("#<Score>", p);
-
-  return 1;
+  SCM context = ly_run_translator (mus, outdef);
+  
+  if (unsmob_translator (context))
+    ly_render_output (context,  head, outname);
 }