public static int dispersionDay(String strDate1, String strDate2) {
int iDay = 0;//记录相差的天数
try {
int index1,index2;
index1=strDate1.indexOf('-');
index2=strDate1.lastIndexOf('-');
int nYear, nMonth, nDay;
nYear = Integer.parseInt(strDate1.substring(0, index1));
nMonth = Integer.parseInt(strDate1.substring(index1+1, index2));
nDay = Integer.parseInt(strDate1.substring(index2+1));
Calendar objCalendarDate1 = Calendar.getInstance();//此函数new GregorianCalendar()
objCalendarDate1.set(nYear, nMonth, nDay);
index1=strDate2.indexOf('-');
index2=strDate2.lastIndexOf('-');
nYear = Integer.parseInt(strDate2.substring(0, index1));
nMonth = Integer.parseInt(strDate2.substring(index1+1, index2));
nDay = Integer.parseInt(strDate2.substring(index2+1));
Calendar objCalendarDate2 = Calendar.getInstance();
objCalendarDate2.set(nYear, nMonth, nDay);
if (objCalendarDate2.equals(objCalendarDate1))
return 0;
if (objCalendarDate2.after(objCalendarDate1))//如果strDate2>strDate1
{
while (!objCalendarDate2.equals(objCalendarDate1)) {
objCalendarDate1.add(objCalendarDate1.DATE, 1);
iDay++;
}
iDay = -iDay;// 负号代表 还相距几天,正号代表已过去几天。。。
} else//如果strDate1>strDate2
{
while (!objCalendarDate2.equals(objCalendarDate1)) {
objCalendarDate2.add(objCalendarDate2.DATE, 1);
iDay++;
}
}
} catch (Exception e) {
}
return iDay;
}
/////////////////////////////使用简单的方法二///////////////////////
Calendar c1=new GregorianCalendar(2008,7,8);
Calendar c2=new GregorianCalendar(2008,1,2);
System.out.println(">>>>>>>>>>>>>>>>==="+(c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60*60*24));
////////////注意点////////////
》》》》》月份是0-11
》》》》》new GregorianCalendar()参数为空代表系统所在时间。。。
如果换为 new Date()且参数为空,那么计算出来结果为错误的。。。。。
改正方案是:new Date(int ,int ,int)带参构造函数。。。。
前言:不少朋友都喜欢人声铃声,毕竟单纯的和弦铃声还是单调了一些。可是限于制作的复杂,和没有较好的教程而不能自己制作铃声。现在我把制作方法简单的说一下,相信对软件上手快的朋友看了后就可以自己制作铃声了。
(虽然现在有pcsync的软件,可以很简单的生成MMF人声,但是由于上限只有200K,而且是固定的16000采样,如果想做小铃声的话也不行,所以限制了大或者小铃声的使用)
先来说明一下需要的步骤:
1 、对声音的采样;
2 、调整单 PCM 模板 MIDI 的长度以配合声音的长度;
3 、把调整的 MIDI 加载声音来合成 MMF 铃声。
第一步:对声源的采样
需要下载Cool Edit Pro 2.0以及Sound Forge 6.0,这两个软件网上很多,大家可以去找找。
这一步很重要,声音的裁剪是否正好就看这一步。当然这一步可以说是最繁琐的一步。所需软件 Cool Edit Pro 或者 Sound Forge 这两个比较实用。在这里只对 Cool Edit Pro 进行介绍,后者也很方便,喜欢的人可以自己试试。 【建议不要用汉化,因为汉化后,将会有软件使用的BUG】
运行 Cool Edit Pro 软件,打开声音源,这里一般用 WAV 或者标准的 MP3 (注:非标准的 MP3 打开时,会出现一个对话框,让你选择频率深度等;建议先用软件吧 MP3 转换为 WAV 后再打开!)。打开后如下图所视
我对常用的按钮和注意点都进行了说明,并用箭头指出了。选择你准备做铃声的一段,可以用放大按钮把波形放大,那就能看的很清楚。选择好后,在选好的波形上点击右键选择复制为新的,如下图。
复制到新的后,就可以采样了。点击采样按钮(图一上已经指出)进行采样设置,40和弦的采样率只能选择 8000 、 11025 、 16000 三种格式,必须选择单声道,采样深度只能选择 16 位!然后选择确定进行采样。完毕后,选择另存为即可!采样设置如下图
另外,对软件右下角的6个时间进行一下说明:如图
第一行从左到右分别为:选定范围的起始时间、选定范围的结束时间、选定范围的时间长度;
第二行从左到右分别为:当前窗口显示的起始时间、当前窗口显示的结束时间、当前窗口显示的时间长度。
第二步:单 PCM 模板 MIDI 的长度调节
要用 CAKEWALK SONAR 或者 Cakewalk Music Creator Pro24 2004 软件对一个单 PCM 模板 MIDI 音轨进行调节,因为我用的是后者,所以在这里介绍后者的使用方法,其实前者也是差不多的用法。操作几乎没有什么太大的区别。
运行 Cakewalk Music Creator Pro24 2004 软件,打开那个单 PCM 模板 MIDI 音轨。然后点击文件菜单( File )选择 Import 中的 Audio… 来导入做好的 WAV 文件。
然后点击波形,再点击音轨 2 ,然后点击钢琴卷帘,如下图
在出现的钢琴卷帘窗口中可以看到上面有排黑的,那个就是波形文件的长度。一般刚刚下载的单 PCM 模板 MIDI 都是有好多块的,必须用橡皮先把多余的都删除,留下一个 C0 中最前面的一个,然后点击箭头,把它拉到 1 的位置,然后在那个音轨上点击右键,弹出音轨长度调节窗口,如图
在音轨调节窗口中可以看见有很多选项,都不需要动,只要对 Duration 中的数字进行修改即可,原来的数字是比例,有些人就认为也必须输入比例数,其实没有必要,直接输入 4 位数或者 5 位数就可以了。多试试就可以大概掌握了。长度只要比上面的黑的部分稍微长一点就可以了。如下图
设置好了后,关闭钢琴卷帘,然后在刚刚的位置可以看到 MIDI 音轨的长度可能还是和原来的不一样,那只要在用鼠标拉短就可以了。如下图
全部弄好后,删除波形文件然后保存 MIDI 音轨就可以了,删除方法如下图
第三步:单 PCM 模板 MIDI 加载 WAV 波形合并生成 MMF 文件。
ATS-MA5-SMAF 软件也需要大家进行下载。
这个只能用 YAMAHA 提供的 ATS-MA5-SMAF 软件来进行合并工作。该软件最新的已经是中文版了。
运行 ATS-MA5-SMAF 软件,先进行设置:点击“选项”菜单,选择“首选”出来设置窗口,在“ AT 模式”中选择“ MA - 3 ”;“内容模式”中选择“ FM32 ”;在“预留 PCM 流”中选择“ 2 Voice Reserved ”;其他的不用做改动,然后点击确定,如下图【这里以40和弦的设置为例,另外说明:新版的MA5中已经没有“预留 PCM 流”选项,那就不用选择了。】
打开单 PCM 模板 MIDI ,然后点击“窗口”菜单中的“ PCM 流分配图”也可以直接点击下面的工具按钮,弹出 PCM 流分配图窗口;在 FS-1 的位置点击鼠标右键,选择“新建”导入做好的 WAV 波形文件,然后点击保存即可!如下图
好了,一个人声铃声就这样做成了,赶快双击一下听听吧,嘿嘿。
另外补充说明一下:降噪问题比较难说,只能靠各位自己琢磨一下了。可以用Cool Edit Pro 自带的降噪。也可以用T-Racks或者iZotope Ozone对采样好的WAV进行音质加工。
发个我写的计算公式代码:
package org.yangzc.math; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 数据计算公式 * @author yangzc * */ public class MathEval { public static char PLUS = '+'; public static char MINUS = '-'; public static char MULTI = '*'; public static char DEVIDE = '/'; public static char BRACKET_LEFT = '('; public static char BRACKET_RIGHT = ')'; /** * 计算带小括号的公式 * @param line * @return */ public static double eval(String line){ while(line.indexOf(BRACKET_LEFT) != -1){ Pattern pattern = Pattern.compile("\\(([^\\(\\)]*?)\\)"); Matcher matcher = pattern.matcher(line); while(matcher.find()){ double result = simpleEval(matcher.group(1)); line = line.replace(matcher.group(), result+""); } } return simpleEval(line); } /** * 计算不带括号的公式 * @param line * @return */ @SuppressWarnings("unchecked") public static double simpleEval(String line){ Stack<Double> valueStack = new Stack<Double>();//保存值的堆栈 Stack<Character> markStack = new Stack<Character>();//保存符号的堆栈 char ch[] = line.toCharArray(); //计算乘除操作 String tmpValue = ""; boolean isOper = false; for(int i=0; i< ch.length; i++){ if( ch[i] == PLUS || ch[i] == MINUS || ch[i] == MULTI || ch[i] == DEVIDE) { double dv = Double.valueOf(tmpValue).doubleValue(); if(isOper){ double dv1 = valueStack.pop(); char op = markStack.pop(); double result = simpleTwoEval(op, dv1, dv); dv = result; } valueStack.push(dv); markStack.push(ch[i]); tmpValue = ""; isOper = false; if( ch[i] == MULTI || ch[i] == DEVIDE ) isOper = true; }else{ tmpValue += ch[i] + ""; if(i == ch.length -1){ double dv = Double.valueOf(tmpValue).doubleValue(); if(isOper){ double dv1 = valueStack.pop(); char op = markStack.pop(); double result = simpleTwoEval(op, dv1, dv); dv = result; } valueStack.push(dv); } } } // for(int i=0; i< valueStack.size(); i++){ // System.out.println(valueStack.get(i)); // } // for(int i=0; i< markStack.size(); i++){ // System.out.println(markStack.get(i)); // } //计算加减操作 valueStack = (Stack<Double>) reverseStack(valueStack); markStack = (Stack<Character>) reverseStack(markStack); while(valueStack.size() > 1){ double v1 = valueStack.pop(); double v2 = valueStack.pop(); char op = markStack.pop(); double result = simpleTwoEval(op, v1, v2); valueStack.push(result); } return valueStack.get(0); } /** * 把整个堆栈翻转 * @param stack * @return */ @SuppressWarnings("unchecked") private static Stack<?> reverseStack(Stack<?> stack){ Stack reverse = new Stack(); int stackSize = stack.size(); for(int i=0; i< stackSize; i++){ reverse.push(stack.pop()); } return reverse; } /** * 只计算简单的两个数结果 * @param op * @param value1 * @param value2 * @return */ private static double simpleTwoEval(char op, double value1, double value2){ if(op == PLUS){ return value1 + value2; }else if(op == MINUS){ return value1 - value2; }else if(op == MULTI){ return value1 * value2; }else if(op == DEVIDE){ return value1 / value2; } return 0; } public static void main(String[] args) { double result = MathEval.eval("1+(2*(3+2))-6+(3/2)+4/2"); System.out.println(); System.out.println(result); } }